迭代函数输出到矩阵中

时间:2016-02-13 07:04:40

标签: matlab loops vector iteration

我有一个迭代函数,它给我两个矢量输出。如何在Matlab中将这些输出存储到两个单独的矩阵中?

[A, B]=iterative_function(x,y)

A和B的大小不变,它们是1x4。

有没有办法在没有'细胞'的情况下做到这一点?

1 个答案:

答案 0 :(得分:2)

如果我理解正确,您希望连接在每次迭代时输出的所有AB&#s。如果它们的大小永远不会改变,则不需要使用单元阵列,您可以使用常规矩阵 您的AB是行向量,因此我们假设您希望将每个结果连接为一行。

A_total=[];
B_total=[];
while(your loop is going)
    [A, B]=iterative_function(x,y)
    A_total=[A_total ; A];
    B_total=[B_total ; B];
end

如果您事先知道循环将完成多少次迭代,您也可以预先分配此类矩阵A_totalB_total,并将每个AB分配给第i行:

A_total=zeros(MaxIteration,4); %because A has length 4
B_total=zeros(MaxIteration,4); %because B has also length 4
for i=1:MaxIterations
    [A, B]=iterative_function(x,y)
    A_total(i,:)=A;
    B_total(i,:)=B;
end

更新:正如@Max正确指出的那样,我认为你也可以做同样的事情(即在矩阵中连接几个大小相等的向量),即使你的向量是不是行向量而是列向量。主要技巧是,现在你不分配1行= 1向量,但是1列= 1向量。我们假设AB不是1x4,而是4x1。这种连接可以很容易地完成如下(在循环内):

    A_total=[A_total , A]; % a space without a comma works just as well
    B_total=[B_total , B];

或者,如果您事先了解迭代次数,则可以通过以下方式预先分配:

A_total=zeros(4,MaxIteration); %because A has length 4
B_total=zeros(4,MaxIteration); %because B has also length 4

这次你的列数与迭代次数一样多,而在前一种情况下,你的行数和迭代次数一样多。 在循环内部,您可以用这种方式替换第i列:

    A_total(:,i)=A;
    B_total(:,i)=B;

其中(我的错误,我之前没有解释)冒号操作符(:)表示"所有这些" (即表达式A_total(:,i)表示第i列和所有行)。

最后,这两种方法都有效,因为AB具有相同的大小,并且它永远不会改变。虽然由于任何原因,如果这些大小变得不同,Matlab将不允许您连接这些向量,并且您唯一的机会依赖于单元格数组。正如您所期望的那样,只有在所有向量具有相同大小的情况下才能创建矩阵(即,您不能连接长度为4的数组和两行中长度为5的数组)。相反,单元阵列是异构数据结构,因此每个单元可以包含您喜欢的任何数据。