2012-11-27 34 views
1

对不起,初学者MATLAB的问题...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 

,如果我不是explicitiy地方A,B &下,在一个行向量,并返回,那么一切都很好。

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 

这是怎么回事?

+0

使用紧缩的第一个版本,这也会产生正确的值: vals =零(5,3);对于i = 1:5, [vals(i,1),vals(i,2),vals(i,3)] = crunch(i)的 。 end disp(vals); – igon

+0

非常感谢,很多学习 – Alasdair

回答

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);将工作太,但并不在这种情况下意义 - 使用常规(不是单元格)数组看起来像在你的代码中正确的方法。