【问题标题】:Repeating rows of matrix in MATLAB在MATLAB中重复矩阵行
【发布时间】:2017-07-11 09:08:00
【问题描述】:

我有一个与这篇文章相关的问题:"Cloning" row or column vectors。我试图解决那里发布的答案,但未能将它们应用于我的问题。


在我的情况下,我想通过转换矩阵来“克隆”矩阵的每一行行

A = [1,2; 3, 4; 5, 6]

进入矩阵

B = [1, 2
     1, 2
     3, 4
     3, 4
     5, 6
     5, 6]

通过多次重复A 的每一行。


到目前为止,我能够使用 repmat 处理单行,例如

A = [1, 2];
B = repmat(A, 2, 1)

>> B = [1, 2
        1, 2]

我试图使用该公式构建一个循环,以获得所需的矩阵。循环看起来像

T = 3; N = 2;
for t = 1:T
    for I = 1:N
      B = repmat(C, 21, 1)
    end
end

有没有人知道如何正确编写循环,或者更好的方法?

【问题讨论】:

  • B = repmat(A,2,1) 没有给出你写的结果。如果我理解你的问题,你想要B=kron(A,[1;1])

标签: matlab matrix


【解决方案1】:

kron

有几种方法可以做到这一点。最短的方法是使用 Adiel 在 cmets 中建议的 kron 函数。

A = [1,2; 3, 4; 5, 6];
B = kron(A, [1;1]);

请注意,ones 向量中的元素数量控制着每行重复的次数。对于n 次,请使用kron(A, ones(n,1))

kron计算kronecker张量积,不一定是快速过程,也不是直观易懂,但确实给出了正确的结果!


reshaperepmat

一个更容易理解的过程可能涉及reshaperepmat 的组合。目的是将矩阵重塑为行向量,重复所需的次数,然后再次重塑以重新获得两列矩阵。

B = reshape(repmat(reshape(A, 1, []), 2, 1), [], 2);

请注意,repmat 函数中的2 控制每行重复的次数。对于n 次,请使用reshape(repmat(reshape(A, 1, []), n, 1), [], 2)


速度

可以编写一个快速基准测试:

% Setup, using a large A
A = rand(1e5, 2);
f = @() kron(A, [1;1]);
g = @() reshape(repmat(reshape(A, 1, []), 2, 1), [], 2);
% timing
timeit(f);
timeit(g);

输出:

  • kron 选项:
    0.0016622 秒
  • repmat/reshape 选项:
    0.0012831 秒

不同尺寸的扩展基准:

总结

  • reshape 选项更快 (~25%),因为每个行只复制一次,所以如果你想在一个大矩阵中每行有 2 个,你应该选择这个选项。

  • reshape 选项的行重复次数似乎具有 O(n) 复杂度。 kron 有一些初始开销,但是当您想要多次重复并且几乎不会因为它们而减慢速度时,它要快得多!如果您要重复多次,请使用kron 方法。

【讨论】:

  • 感谢您解释我懒惰的事情...... :) 而且,为了有趣的基准!
  • 我的荣幸!我不会想到使用kron,所以很想看看这些方法的比较:)
  • 非常感谢大家! @Adiel:我让它在我的代码中工作。很抱歉之前的错误规格。你帮了大忙! Wolfie:你的回答对我很有帮助,尤其是对我这样的初学者!谢谢! ... 很遗憾,我无法投票支持您的回复。很可能,我必须先获得这个特权;)
  • 接受答案对我来说已经足够了@Joe,干杯!如果您想查看第二种学习方法中的步骤,您可以单独执行 3 个操作中的每一个。我只是将它们捆绑在一起,因为我正在与一个只需要十几个字符的解决方案竞争!
  • @Adiel 你可能会觉得我的编辑很有趣,kron 似乎有很多重复。
猜你喜欢
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多