2012-06-27 4 views
2

У меня есть массив ячеек анонимных функций и хотел бы создать одну анонимную функцию, которая возвращает вектор, содержащий вывод каждой функции.Объединение анонимных функций в MATLAB

Что у меня есть:

ca = {@(X) f(X), @(X)g(X), ...} 

Что я хочу:

h = @(X) [ca{1}(X), ca{2}(X), ...] 

ответ

4

Еще один путь к нему:

Вы можете использовать cellfun применить функцию к каждому элементу массива клеток , который дает вам вектор с соответствующими результатами. Хитрость заключается в применении функции, которая вставляет некоторое значение в дескриптор функции, который хранится в массиве ячеек.

ca = {@(X) X, @(X) X+1, @(X) X^2}; 
[email protected](x) cellfun(@(y) y(x), ca); 

дает

>> h(4) 

ans = 
    4  5 16 
+0

В моем опыте cellfun (или matfun) является очень эффективным в итерация массивы. Это, вероятно, самый быстрый способ сделать это. – denahiro

0

Я обнаружил, что, называя каждую функцию, я мог получить их, чтобы вписаться в массив. Я не совсем понимаю, почему это работает, но это так.

f = ca{1}; 
g = ca{2}; 

h = @(X) [f(X), g(X)]; 

Я чувствую, что должен быть более простой способ сделать это. Поскольку я имею дело с неизвестным числом функций, мне пришлось использовать eval() для создания переменных, что является плохим знаком. С другой стороны, вызов новой функции работает так, как предполагается.

1

Вы можете использовать str2func создать анонимную функцию без необходимости прибегать к eval:

ca = {@sin,@cos,@tan} 
%# create a string, using sprintf for any number 
%# of functions in ca 
cc = str2func(['@(x)[',sprintf('ca{%i}(x) ',1:length(ca)),']']) 

cc = 
    @(x)[ca{1}(x),ca{2}(x),ca{3}(x)] 

cc(pi/4) 

ans = 
    0.7071 0.7071 1.0000 
Смежные вопросы