我想在循环中为矩阵分配一些值,但我不知道有多少。 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
appears to change size in every loop iteration.
最佳答案
如果 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
在 A
中行号 ii
的第 1 到 m 列中。现在,由于 B
的列多于 A
,MATLAB 将自动用零填充剩余的矩阵。
您可以自己尝试一些。不要复制粘贴,一个接一个地尝试,这样您就可以看到 A
在每一行之后是如何变化的。希望这能解决问题!
A = []
A(2,1) = 3
A(1,3) = 2
A(3,:) = [5 6 7]
A(:,6) = [1; 2; 3]
A(3,:)
A(3,1:end)
A(:,3)
A(1:end,3)
关于matlab - 当一维未知时在循环之前定义一个矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26472155/