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 回答