在MATLAB中重复矩阵行

Joe*_*Joe 1 matlab matrix

我有一个与这篇文章有关的问题:"克隆"行或列向量.我试图解决那里发布的答案,但未能将它们应用到我的问题中.


就我而言,我想通过转换矩阵来"克隆"矩阵的每一行

A = [1,2; 3, 4; 5, 6]
Run Code Online (Sandbox Code Playgroud)

进入矩阵

B = [1, 2
     1, 2
     3, 4
     3, 4
     5, 6
     5, 6]
Run Code Online (Sandbox Code Playgroud)

通过重复每一行A多次.


到目前为止,我能够repmat像单行一样工作

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

>> B = [1, 2
        1, 2]
Run Code Online (Sandbox Code Playgroud)

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

T = 3; N = 2;
for t = 1:T
    for I = 1:N
      B = repmat(C, 21, 1)
    end
end
Run Code Online (Sandbox Code Playgroud)

有谁知道如何正确编写循环,或更好的方法来做到这一点?

Wol*_*fie 5

kron

有几种方法可以做到这一点.最简单的方法是使用kronAdiel在评论中建议的功能.

A = [1,2; 3, 4; 5, 6];
B = kron(A, [1;1]);
Run Code Online (Sandbox Code Playgroud)

请注意,1矢量中的元素数量控制每行重复的次数.对于n次,连用kron(A, ones(n,1)).

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


reshaperepmat

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

B = reshape(repmat(reshape(A, 1, []), 2, 1), [], 2);
Run Code Online (Sandbox Code Playgroud)

需要注意的是,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);
Run Code Online (Sandbox Code Playgroud)

输出:

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

不同尺寸的扩展基准:

基准

摘要:

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

  • reshape选项似乎具有行重复次数的复杂度O(n).kron有一些初步的开销,但快,当你想多次重复,几乎没有减慢,因为他们的失望!kron如果你做了几次重复,那就去找一下这个方法吧.