2016-03-29 8 views
0

私は関数のベクトルを持っており、それから部分集合を取得しようとしています。私はベクトルの関数をセル配列に変換して、それにインデックスを付けることができます。ここにスクリプトがありますMatlabのstrcatの後に未定義の関数または変数

coeff1 = 1; 
coeff2 = 2; 
coeff3 = 3; 

F = @(x) [... 
coeff1*x(1)*x(4); ... 
0; ... 
coeff2*x(3); ... 
coeff3*x(7)*x(3) ... 
]; 

G = regexp(func2str(F), ';|\[|\]', 'split'); 
H = cellfun(@str2func, strcat(G{1}, G(2:end-1)), 'uni', 0); 
F2 = @(y)cellfun(@(x)x(y),H(2:4)); 
F2(rand(1,4)); 

しかし、この機能をテストするとエラーが発生します。 coeff1は未定義です。どうにかして、解析された関数はそれを認識しません。何が間違っていますか?

ありがとうございます。

+0

'F'は関数のベクトルではありません。ベクトルを返す関数です。 – zeeMonkeez

+0

なぜ' F'の出力をインデックスするだけで十分ではないのですか? – zeeMonkeez

+0

@zeeMonkeez訂正してくれてありがとう! Fの出力を索引付けするだけでは十分ではありません。私はそれを必要とするアルゴリズムをテストしているため、サブセットが必要です。 – milez

答えて

0

@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に適用することができる機能を返します。

+0

それは賢いですが、coeffx * x1 * x2 + coeffy * x3 * x4という形式のいくつかの行があります。そして、これは本当に質問に答えるものではありません。: – milez

+0

@milez excazaと私はあなたがしようとしていることは不可能で、いくつかの注意点を挙げてなぜ裏付けましたか?これは今私の答えです。私はその合計を反映するために例を拡張しました。私はまだこれがstring/cell/str2func操作よりも速いと確信しています。 – zeeMonkeez

+0

ええ、それは効率的です!それは私が想像していた通りに行えないことを知っていることを嬉しく思います。 – milez

関連する問題