当一个维度未知时,在循环之前定义矩阵

时间:2014-10-20 18:09:03

标签: matlab loops variables matrix

我想在循环中为矩阵分配一些值,但我不知道有多少。 B是基于循环内的数据集Data(i,:)计算的向量。 B中的元素数量在循环内是固定的,但事先是未知的。

就像;

A = zeros(n,m) %// I know n but I do not know m
for i = 1 : n
    % some code to calculate B from Data(i,:)
    A(i,:) = B;
end

B是一个向量,但我在循环之前不知道length(B),因此我无法将其分配给m
当我初始化A = [];时,Matlab发出警告

  

A似乎会在每次循环迭代中改变大小。

2 个答案:

答案 0 :(得分:6)

如果B具有固定长度,则可以选择:

A = zeros(n,[]);
for ii = 1:n
   A(ii,1:numel(B)) = B;
end

这样您就可以预先分配行数,在第一次迭代后,列数将固定为numel(B)

那么,为什么A(ii,1:numel(B)) = B有效且A(ii,:) = B没有?

当您执行A(ii,:) = B时,您尝试将矢量B放在ii的行号A中。要实现此目的,AB中的列数必须相等。您可以将其视为:

A(ii,:) = B

等于

A(ii,1:end) = B(1:end); 

如果你从一个空数组A开始,或者一个行数为n行但列数为零的数组,则两个end不会相等,你会得到一个维度不匹配

但是,如果您执行A(ii,1:numel(B)) = B,则明确指出您正在尝试将向量B放入ii行{1}中的第1列到第m列中{1}}。现在,由于A的列数多于B,因此MATLAB将使用零自动填充剩余的矩阵。

你可以自己尝试一下。不要复制粘贴,一个接一个地尝试,以便您可以看到每行后A的变化情况。希望这能解决问题!

A

答案 1 :(得分:2)

您也可以反转循环的顺序,而无需任何预分配

for ii=n:-1:1
    A(ii,:) = B;
end

这样,第一次访问A时,Matlab实际访问最后行,因此确切知道A的最终大小,A不会在迭代期间改变大小。

请参阅此技巧in this thread

PS,
最好not to use i as a variable name in Matlab