在MATLAB中重复矩阵行

时间:2017-07-11 09:08:01

标签: matlab matrix

我有一个与此帖相关的问题:"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

有谁知道如何正确编写循环,或者更好的方法来执行此操作?

1 个答案:

答案 0 :(得分:5)

kron

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

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

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

kron计算kronecker张量积,它不一定是 fast 过程,也不是直观的理解,但它确实给出了正确的结果!

reshaperepmat

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

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

请注意2函数中的repmat控制每行重复的次数。对于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秒

不同尺寸的扩展基准:

benchmark

摘要

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

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