匿名関数ハンドルのセル配列があり、各関数の出力を含むベクトルを返す匿名関数を1つ作成したいと思います。
私が持っているもの:
ca = {@(X) f(X), @(X)g(X), ...}
私が欲しいもの:
h = @(X) [ca{1}(X), ca{2}(X), ...]
匿名関数ハンドルのセル配列があり、各関数の出力を含むベクトルを返す匿名関数を1つ作成したいと思います。
私が持っているもの:
ca = {@(X) f(X), @(X)g(X), ...}
私が欲しいもの:
h = @(X) [ca{1}(X), ca{2}(X), ...]
それへのさらに別の方法:
cellfunを使用して、各 cell 配列要素に関数を適用できます。これにより、それぞれの結果を含むベクトルが得られます。秘訣は、セル配列に格納されている関数ハンドルに値を差し込む関数を適用することです。
ca = {@(X) X, @(X) X+1, @(X) X^2};
h=@(x) cellfun(@(y) y(x), ca);
与える
>> h(4)
ans =
4 5 16
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
各関数に名前を付けることで、それらを配列に収めることができることがわかりました。なぜこれが機能するのかよくわかりませんが、機能しました。
f = ca{1};
g = ca{2};
h = @(X) [f(X), g(X)];
これを行うにはもっと簡単な方法があるはずだと思います。不明な数の関数を扱っているため、eval()を使用して変数を作成する必要がありましたが、これは悪い兆候です。一方、新しい関数の呼び出しは、想定どおりに機能します。