функции суммирования в matlab - PullRequest
6 голосов
/ 16 января 2011

Привет
Я пытаюсь суммировать два дескриптора функции, но это не работает. например:

у1 = @ (х) (х * х) *; +1006 * у2 = @ (х) (х * х + 3 * х);
у3 = у1 + у2

Я получаю сообщение об ошибке: «Неопределенная функция или метод« плюс »для входных аргументов типа« function_handle ».»

Это лишь небольшой пример, в действительности мне действительно нужно итеративно суммировать около 500 функций, которые зависят друг от друга.

EDIT
Решение Клемента Дж. Действительно работает, но я не смог обобщить это в цикл и столкнулся с проблемой. У меня есть функция s=@(x,y,z)((1-exp(-x*y)-z)*exp(-x*y)); И у меня есть вектор v, который содержит 536 точек данных и еще один вектор w, который также содержит 536 точек данных. Моя цель - суммировать s (v (i), y, w (i)) для i = 1 ... 536 Таким образом, получая одну функцию в переменной y, которая является суммой 536 функций. Синтаксис, который я попытался сделать для этого:

sum=@(y)(s(v(1),y,z2(1))); 
for i=2:536 
  sum=@(y)(sum+s(v(i),y,z2(i))) 
end

Ответы [ 2 ]

5 голосов
/ 16 января 2011

Решение, предложенное Федором Сойкиным, работает.

>> y3=@(x)(y1(x) + y2(x))
y3 =
@(x) (y1 (x) + y2 (x))

Если вы хотите сделать это для нескольких функций, вы можете использовать промежуточные переменные:

>> f1 = y1;
>> f2 = y2;
>> y3=@(x)(f1(x) + f2(x))

РЕДАКТИРОВАТЬ после комментария: IЯ не уверен, чтобы понять проблему.Можете ли вы определить свои векторы v и w, как это вне функции:

v = [5 4]; % your 536 data
w = [4 5];
y = 8;
s=@(y)((1-exp(-v*y)-w).*exp(-v*y))
s_sum = sum(s(y))

Обратите внимание на точку в умножении, чтобы сделать это поэлементно.

2 голосов
/ 17 января 2011

Я думаю, что наиболее краткое решение дано в комментарии Михаила.Я уточню это подробнее ...

Во-первых, вы захотите изменить свою анонимную функцию s, чтобы она могла работать с векторными входами того же размера, что иа также скалярные входные данные (, как предложено Клементом Дж. ) с использованием поэлементных арифметических операторов следующим образом:

s = @(x,y,z) (1-exp(-x.*y)-z).*exp(-x.*y);  %# Note the periods

Затем при условии, что у вас есть векторыv и w, определенные в данном рабочем пространстве, вы можете создать новую функцию sy, которая при заданном скалярном значении y будет суммироваться по s, вычисленной для каждого набора значений в vи w:

sy = @(y) sum(s(v,y,w));

Если вы хотите оценить эту функцию, используя массив значений для y, вы можете добавить вызов функции ARRAYFUN следующим образом:

sy = @(y) arrayfun(@(yi) sum(s(v,yi,w)),y);

Обратите внимание, что значения для v и w, которые будут использоваться в функции sy, будут фиксированными на то, что они были при создании функции .Другими словами, изменение v и w в рабочей области не изменит значения, используемые sy.Обратите внимание, что я не назвал новую анонимную функцию sum, поскольку уже существует встроенная функция с таким именем .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...