我想在循环中为矩阵分配一些值,但我不知道有多少。 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
似乎会在每次循环迭代中改变大小。
答案 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
中。要实现此目的,A
和B
中的列数必须相等。您可以将其视为:
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。