保存函数的返回值,在Matlab中返回多个变量

时间:2013-05-02 04:09:56

标签: arrays matlab function indexing

我从来没有使用过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。

1 个答案:

答案 0 :(得分:2)

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

如果要将每次运行的结果分开,可以将它们存储在单元格数组中。您仍然需要在LHS上以逗号分隔的列表来获取所有多个argouts。 {} - 索引语法,与()相对,“弹出”内容进出单元格元素。

让我们将结果存储在名为x的k-by-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

详细信息位于http://www.mathworks.com/help/matlab/cell-arrays.htmldoc cell的doco中。

(旁注:你帖子中的results(1, 2)应该成功获得一个大小的数组[1,99654]。当然你没有results(2, 1)?)