我从来没有使用过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。
答案 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.html或doc cell
的doco中。
(旁注:你帖子中的results(1, 2)
应该成功获得一个大小的数组[1,99654]。当然你没有results(2, 1)
?)