2

我以前从未使用过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。

4

1 回答 1

2

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

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

让我们将结果存储在一个名为 的 k×n 数组x中,其中函数返回 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}

您还可以将参数存储在单独的变量中,这可能更具可读性。在这种情况下,每个都是一个 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.

(旁注:results(1, 2)在您的帖子中,对于大小为 [1,99654] 的数组,您应该成功。确定您没有这样做results(2, 1)吗?)

于 2013-05-02T04:32:05.617 回答