1

初心者のMATLABの質問でごめんなさい...

function [ A B C ] = crunch(i)
  A = i^2;
  B = 2*A;
  C = A+B;
end;

vals = zeros(5,3);
  for i=1:5
    vals(i,:) = crunch(i);
  endfor;
disp(vals);

これは私が期待した結果ではありません。

vals =
 1 1 1
 4 4 4
 9 9 9
 ..... etc

代わりに、A、B、Cを行ベクトルに明示的に配置して返す場合は、すべて問題ありません。

function retval = crunch(i)
  A = i^2;
  B = 2*A;
  C = A+B;
  retval = [ A B C ];
end;

ans = 
  1    2    3
  4    8   12
  9   18   27
 16   32   48
 25   50   75

ここで何が問題になっていますか?

4

1 に答える 1

4

MATLABは通常、明示的に要求しない限り、複数の戻り値を提供することを躊躇します。したがって、最初のバージョンでは、次のようにします。

vals(i,:) = crunch(i);

MATLABが行うことは、から最初の戻り値を取得しcrunch(i)、それをのすべての要素にブロードキャストすることですvals(i,:)。それは次のようなものです。

return_val = crunch(i);
vals(i,:) = return_val;

MATLABに複数の戻り値を明示的に要求すると、目的の動作が得られます。@igonが指摘しているように、このバージョンでは動作が修正されます。

[vals(i,1), vals(i,2), vals(i,3)] = crunch(i);

valsまたは、セル配列であれば機能すると思いますがvals{i, :} = crunch(i);、この場合は意味がありません。通常の(セルではない)配列を使用することは、コードでの正しいアプローチのようです。

于 2012-11-27T00:45:34.437 に答える