2012-05-01 10 views
0

だから私はベクトルXのセル配列を持っている:Octave/MATLAB:変数のスコープと名前の参照?

octave:149> X 
X = 
{ 
    [1,1] = 

     1 17 20 

    [2,1] = 

     5 20 22 27 

    [3,1] = 

     2 17 18 21 

} 

私は、空のベクターY作成:

octave:150> Y = [] 
Y = [](0x0) 

を私はその後、(Y =ユニークな」とXの各値に無名関数を呼び出します[YのX]) ":

octave:151> cellfun(@(x)(Y = unique([Y x])),X,'UniformOutput',false) 
ans = 
{ 
    [1,1] = 

     1 17 20 

    [2,1] = 

     1 5 17 20 22 27 

    [3,1] = 

     1 2 5 17 18 20 21 22 27 

} 

[OK]を、今Yはまだ空である:

octave:152> Y 
Y = [](0x0) 
octave:153> 
作成した匿名関数の内部 明らかに

Y名とオクターブ/ MATLABで保管し、名前解決のルールは何ですか?Y.

の独自のバージョンのために新しいストレージを拘束変数にストレージが割り当てられるのはいつですか? 2つの同じ名前が同じ変数にバインドされているのはいつですか? (上記の無名関数でYの値に影響を及ぼす方法はありますか?)

答えて

1

Matlab関数には独自のスコープがあります。変数を渡すと、その変数も出力リストになければ、呼び出された関数によって変更されません。関数は変数のコピーを作成し、コピーは関数が変更するものです。

匿名関数を使用すると、変数は関数宣言でコピーされます。 this Matlab documentationを参照してください。これは、あなたがYで見ているものです。

また、私は間違ってcellfunを使用していると思います。 cellfunの呼び出しの中ではなく、cellfunの結果として、無名関数の値を返すべきではありません。

ので、おそらくこれはあなたが望むものに近いです:

octave:151> Y = cellfun(@(x, y)(unique([y x])),X,Y,'UniformOutput',false) 

あなたはそれぞれの呼び出しの結果をしたい場合、私はYを変更し、次の呼び出しでその結果を使用するために、匿名関数に伝えることはできません。それがあなたが望むものなら、それはもっと難しくなります。

+0

私は、セル配列内のベクトルを「結合」しようとしています。最後に、Yは '[1 2 5 17 18 20 21 22 27]' –

+0

と等しくなければなりません。つまり、セル配列内のベクトルの和集合を求めたいと思います。 –

+1

中間ステップのない集合体が必要な場合は、次のようにします: 'Y = unique([X {:}])'。これはMatlabが[コンマ区切りリスト](http://www.mathworks.co.uk/help/techdoc/matlab_prog/br2js35-1.html#br2js35-9)から配列を作成できるという事実を利用しています。この解は、セル内のすべてのベクトルが「1xn」であると仮定します。 – AE426082

関連する問題