@excazaが指摘したように、str2func
で生成された関数は、ワークスペースにない変数にアクセスすることはできません。 、coeff1
は(1)
なっ等それとも、1つのベクトル内のすべての係数を格納し、2番目の引数として渡すこともできます:あなたはstrrep
またはregexprep
で値を変数名の出現を置き換えることができます:それは2つの回避策をあなたに残し
F = @(x, coeff) [...
coeff(1)*x(1)*x(4); ...
それでも文字列操作と関数ハンドル操作を扱うことになります。どちらもコストがかかり、壊れやすい傾向があります。あなたの元の質問がわずかに異なるであり、具体的にあなたはスピードをしたいと述べているので、私は別のアプローチを提案してみましょう:
あなたの例では、F
は、各行がx
の特定の要素の積である、すなわちことを、特定の構造を持っていることを示唆しています定数倍します。あなたがそれらを必要とするように、その場合には、この関数を生成するには、この構造を利用することができる ハンドル:
% Coefficient matrix for x. Along second dimension,
% elements of x will be multiplied with these factors. Along third
% dimension, these products (multiplied with the corresponding item of C)
% will be summed.
X = logical(cat(3, ...
[ 1 0 0
0 1 1
0 0 0
0 0 0
1 1 1 ], ...
[ 0 0 0
1 0 0
0 0 0
0 0 1
0 0 0 ]));
% coefficients for each row
C = [ 1, 2
2, 3
0, 0
0, 3
1, 0 ];
% anonymous function generating anonymous functions for particular rows
F = @(ind) @(x) sum(C(ind, :) .* squeeze(prod(bsxfun(@times, X(ind, :, :), x) + ~X(ind, :, :), 2)), 2);
% get one of those functions and test
newF = F([2 4]);
x = [1, 2, 3];
newF(x)
allF = F(':');
allF(x)
だからF
は行インデックス与えられ、関数であり、x
に適用することができる機能を返します。
'F'は関数のベクトルではありません。ベクトルを返す関数です。 – zeeMonkeez
なぜ' F'の出力をインデックスするだけで十分ではないのですか? – zeeMonkeez
@zeeMonkeez訂正してくれてありがとう! Fの出力を索引付けするだけでは十分ではありません。私はそれを必要とするアルゴリズムをテストしているため、サブセットが必要です。 – milez