2016-07-06 3 views
0

У меня есть следующая проблема. Я пытаюсь создать дескриптор функции, который является вектором. В частности, у меня есть что-то вроде этогоСоздание дескриптора функции для каждого элемента в векторе (Matlab)

EQ0 = @(W) m1.^2*(exp(W))-m2.^2 

где m1 и m2 - векторы того же размера. Итак, для каждого m1 (i) и m2 (i) я хочу иметь ручку W (i). Мне это нужно для того, чтобы найти те W (I) 'ы в следующем шаге, используя fsolve в чем-то, глядя, как этот

n=size(m1)   
    x0 = zeros(n); 
    Wbar = fsolve(EQ0,x0) 

Я попытался с помощью arrayfun, но получил следующее сообщение об ошибке

EQ0 = arrayfun(@(W) m1.^2*(exp(W))-m2.^2, m1=m1e, m2=m2e) 
    Error: The expression to the left of the equals sign is not a valid target for an assignment. 

Еще одна попытка при помощи arrayfun в результате этого (здесь я использовал m1 и m2 векторов непосредственно, а не в качестве входов, как и в предыдущем случае)

EQ0 = arrayfun(@(W) m1.^2*(exp(W))-m2.^2,:) 
    Undefined variable arrayfun. 

Я явно не хватает что-то. Я просмотрел некоторые каналы на сервере arrayfun, но похоже, что моя проблема несколько отличается.

Любые советы приветствуются.

+0

Не является ли функция дескриптором скорее EQ0, чем W? если здесь зацикливается опция, так что у вас будет EQ0 (1:10) и x0 (1:10) и цикл через 10 разных? – Finn

+0

Это ** не ** Python. 'm1 = m1e' и' m2 = m2e' неверный синтаксис. – rayryeng

+0

@Finn. Моя единственная цель здесь состоит в том, чтобы в конечном итоге решить систему независимых нелинейных уравнений для W. Определим функцию f (W, m1, m2, ...), где W будет матричным входом (nxm) и то я хочу назначить дескриптор для управления этой матрицей W, чтобы иметь возможность использовать fsolve для поиска этих Ws (подумайте о проблеме с фиксированной точкой для каждой записи этой матрицы (nxm)). –

ответ

0

Итак, если я правильно понял, что вы хотите иметь для каждого m1 (i) или m2 (i) отдельный дескриптор функции EQ0 (i), который может работать с вектором W следующим образом: EQ0 (i) = @ (W) m1 (i)^2 * (exp (W)) - m2 (i)^2. Это верно? В этом случае вы можете создать ячеистую массив той же размерности, m1 с функцией ручки в каждом измерении:

EQ0 = cell(size(m1)); 
for ii = 1:numel(m1) 
    EQ0(ii) = {@(W) m1(ii)^2*exp(W)-m2(ii)^2}; 
end 

EDIT: Другой вариант может быть:

EQ0 = @(W)arrayfun(@(Wel,m1el,m2el)m1el^2*exp(Wel)-m2el^2,W,m1,m2); 
fsolve(EQ0, W_Values) 

Здесь m1, m2 должна быть заранее определены. В противном случае вы должны добавить их в качестве аргументов первой анонимной функции. Итак, позвонив по номеру arrayfun(@(Wel, m1el, m2el)..., W, m1, m2), вы делаете свои элементарные вычисления для записей в W, m1, m2, определенных маркером анонимной функции, который вы передали в первом аргументе arrayfun. Но так как вы хотите определить свой W по-разному каждый раз, вы делаете анонимную функцию этой команды arrayfun, которая принимает в качестве аргумента W.

+0

Это, кажется, решение для проблема. Если есть способ сделать это без циклов, я хотел бы знать, как на будущее (если это означает, что это быстрее). –

+0

Просто комментарий: несмотря на то, что вышеописанная вещь работает, поскольку выполнение выше в цикле, а затем применение fsolve в цикле (мои матрицы имеют более 100 000 отдельных записей) довольно неэффективно. Все еще ждущий завершения кода .... –

+0

Ah ok Я думаю, что то, что вы ищете, похоже на то, что я редактировал? –