【问题标题】:Varying sized rows in matrix - matlab矩阵中不同大小的行 - matlab
【发布时间】:2015-09-20 23:13:28
【问题描述】:

假设我有一个大小为5x1 的向量a,并在该向量的开头填充零。零的数量是使用randn 函数生成的。由于randn,向量在for 循环中填充了随机数量的零。我想将这些不同大小的向量存储在一个矩阵中,但我无法想出如何做到这一点(除了事先固定矩阵的大小。这是相同的 MWE:

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

在第二次迭代中,由于temp_mat(:,ii) = shifted_a处的赋值不匹配,matlab肯定会抛出错误。有没有一种方法可以将所有这些向量放在一个矩阵中,而不必提前固定矩阵的大小。

【问题讨论】:

  • 矩阵只能有常规大小。也许您应该改用cells,即将每个移位的vector 保存在一个cell 中。

标签: matlab matrix


【解决方案1】:

请改用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{:});

【讨论】:

  • 这似乎是一个不错的选择,但是一旦我有了单元格数组,然后根据 temp_mat 的最大列的大小,我也需要增加 temp_mat 中其他列的大小,所以temp_mat 中的所有列都将具有相同的大小。这就是我考虑使用 matries 的原因。所以我认为vertcat 在这种情况下不会有用。
  • 但是您需要确定填充较小列的值(即在末尾放置零)。
  • 你没有说你想用这些值做什么。你刚才说你想要存储一个不同大小的矩阵。元胞数组将为您做到这一点。 vertcat 只是我期待您想将它们加入一个长向量中。填充它们以匹配最大向量是一个不同的问题。
  • 很抱歉给您带来了误会。我想通过在末尾附加零来填充较小的列以匹配单元格数组的最大列的大小,但我不知道我应该怎么做
  • 提出一个新问题。
【解决方案2】:

根据@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 可以替换...)。

【讨论】:

  • 可以替换length吗?根据chappjc,你永远不应该使用length
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多