2015-07-03 393 views
2

请考虑我有一个大小为5x1的矢量a,并且在此向量的开头填充零。零的数量是使用randn函数生成的。由于randn,矢量在for循环中被随机数的零填充。我想将这些不同大小的矢量存储在一个单一的矩阵中,我无法想象如何做到这一点(除了在手之前固定矩阵的大小,这里是一个MWE:矩阵中不同大小的行 - matlab

a = rand(5,1) 
for ii = 1 : 6 
delay = round(abs(randn(1,1))); 
shifted_a = [zeros(delay,1);a]; 
temp_mat(:,ii) = shifted_a  
end 

在第二次迭代,MATLAB肯定会在temp_mat(:,ii) = shifted_a抛出一个错误,由于分配不匹配。有没有一种方法,我可以在矩阵中的所有这些载体,而无需固定矩阵的大小提前。

+0

矩阵只能有一个规则的大小。也许你应该使用'cells'来代替,也就是将每个移位的vector都保存在一个cell中。 – Nemesis

回答

2

改为使用cell array

a = rand(5,1); 
for ii = 1 : 6 
    delay = round(abs(randn(1,1))); 
    shifted_a = [zeros(delay,1);a]; 
    temp_mat{ii} = shifted_a; % // Use a cell array instead 
end 

如果你想加入他们,你可以使用vertcat制作一个长矢量。

B=vertcat(temp_mat{:}); 
+0

这似乎是一个不错的选择,但是一旦我有单元格数组,然后根据temp_mat最大列的大小,我需要增加temp_mat中其他列的大小,以便temp_mat中的所有列都会尺寸相同。这就是我正在考虑使用matries的原因。所以我认为'vertcat'在这种情况下不会有用。 – smyslov

+0

但是您需要决定填充较小列的值(即将零置于最后)。 – Nemesis

+0

你没有说明你想要对值做什么。你刚刚说过你想存储一个不同大小的矩阵。单元阵列将为你做到这一点。 'vertcat'就是我期待的,你想把它们合并成一个长矢量。填充它们以匹配最大的矢量是另一个问题。 – kkuilla

1

要完成基于@kkuillas的问题回答:

您可以通过

max_len = max(cell2mat(cellfun(@(x)size(x,1),temp_mat,'UniformOutput',false))); 

找出列的最大长度,然后创建最终矩阵

fin_mat = zeros(max_len,size(temp_mat,2)); 

for i = 1:length(temp_mat) 
    fin_mat(1:size(temp_mat{i},1),i) = temp_mat{i}; 
end 

(也许for -loop可以被替换...)。

+1

是否可以取代'length'?根据[chappjc](https://stackoverflow.com/users/2778484/chappjc),你不应该使用'length'。 – kkuilla

+1

您可以使用'size()'来代替。看我的编辑。 – Nemesis

相关问题