2013-05-02 92 views
2

我以前从未使用matlab,所以请原谅这个非常基本的问题。在Matlab中保存函数返回多个变量的返回值

基本上我已经返回多个变量的函数,定义如下所示:

function [a, b, c]=somefunction(x, y, z) 

我知道我能得到的返回值如下:

[a,b,c] = somefunction(1,2,3); 

现在我想做些什么而是将somefunction的多次运行保存到数组中,然后再检索它们。我想:

results = []; 
results = [results somefunction(1,2,3)]; 
results = [results somefunction(4,5,6)]; 

然后我试图访问各个运行为:

% access second run, i.e. somefunction(1,2,3) ? 
a = results(2, 1); 
b = results(2, 2); 
c = results(2, 3); 

但是这告诉我,该指数是越界,因为size(results) = [1,99654](99654是我需要的结果数保存)。所以它看起来不是一个数组?对不起,这个基本的问题,我再也没有使用过matlab。

回答

2

当您将阵列与[ ... ]组合在一起时,您将它们连接在一起,从而创建一个长扁平数组。例如,如果调用1返回3个元素,调用2返回8个元素,调用3返回4个元素,那么最终会得到一个14长的数组,并且无法知道哪些元素来自哪个函数调用。

如果您想要将每次运行的结果分开,可以将它们存储在单元阵列中。你仍然需要一个逗号分隔的LHS列表来获取所有的多个参数。与()相反,诠释语法将内容“弹出”出入单元元素。

让我们将结果存储在一个名为x的k乘n数组中,函数返回n个输出,我们将其称为k次。

x = cell(2, 3); % cell(k, n) 
% Make calls 
[x{1,1}, x{1,2}, x{1,3}] = somefunction(1,2,3); 
[x{2,1}, x{2,2}, x{2,3}] = somefunction(4,5,6); 
% Now, the results of the ni-th argout of the ki-th call are in x{ki,ni} 
% E.g. here is the 3rd argout from the second call 
x{2,3} 

您还可以将argouts存储在单独的变量中,这些变量可能更具可读性。在这种情况下,每个将是一个K-长的矢量

[a,b,c] = deal(cell(1,2)); % cell(1,k) 
[a{1}, b{1}, c{1}] = somefunction(1,2,3); 
[a{2}, b{2}, c{2}] = somefunction(1,2,3); 

当然,这种推广到循环,如果你somefunction输入是服从于和。

[a,b,c] = deal(cell(1,nIterations)); 
for k = 1:nIterations 
    [a{k}, b{k}, c{k}] = somefunction(1,2,3); 
end 

细节在DOCO在http://www.mathworks.com/help/matlab/cell-arrays.htmldoc cell

(旁注:在您的文章results(1, 2)应该尺寸为[1,99654]数组成功当然你没做results(2, 1)?)

+0

感谢!是的,结果(2,1)'不是另一个失败了,现在已经确定了 – houbysoft 2013-05-02 04:49:57