0

だから私はベクトルXのセル配列を持っています:

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 = unique([Y x])」を使用して、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

}

わかりました、しかし今Yはまだ空です:

octave:152> Y
Y = [](0x0)
octave:153> 

明らかに、無名関数内のY名は、独自のバージョンのYの新しいストレージを作成してバインドしました。

Octave / MATLABのストレージと名前解決のルールは何ですか?ストレージはいつ変数に割り当てられますか?2つの同じ名前が同じ変数にバインドされるのはいつですか?(上記の無名関数でYの値を有効にする方法はありますか?)

4

1 に答える 1

1

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

匿名関数の場合、変数は関数宣言時にコピーされます。このMatlabのドキュメントを参照してください。これはあなたがYで見ているものです。

また、cellfunを誤って使用していると思います。cellfunの呼び出し内ではなく、cellfunの結果として無名関数の値を返す必要があります。

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

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

匿名関数への各呼び出しの結果でYを変更し、その結果を次の呼び出しで使用するかどうかはわかりません。それがあなたが望むものであるならば、それはより難しいでしょう。

于 2012-05-01T04:58:01.047 に答える