平铺矩阵逐行

use*_*154 2 matlab

我想重复每一行n次,例如:

A= [123
    456
    789];
Run Code Online (Sandbox Code Playgroud)

所以我希望:

b=[123
   123
   123
   456
   456
   456
   789
   789
   789];
Run Code Online (Sandbox Code Playgroud)

我试过了repmat:

B = repmat(A,3,1)
Run Code Online (Sandbox Code Playgroud)

但这不会导致b上述......我该怎么做?

Rod*_*uis 5

对于向量,只需repmat在转置上使用,然后展开:

A = [123;456;789];
A = repmat(A.', 3, 1);
A = A(:);
Run Code Online (Sandbox Code Playgroud)

更一般地说,对于任何矩阵/张量,使用repmat指数:

A = [ 1 2 3; 4 5 6; 7 8 9 ];
A = A(repmat(1:end, 3, 1), :);
Run Code Online (Sandbox Code Playgroud)

或者,根据Colin T Bowers的回答,更快的替代方案是

A = A( ones(3,1) * (1:end), :);
Run Code Online (Sandbox Code Playgroud)

这有点难以阅读,因此请添加一条注释行来描述使用它时的功能.

另请参阅Kronecker产品:

A = kron(A, [1;1;1]);
Run Code Online (Sandbox Code Playgroud)

这有时非常有用.


Col*_*ers 5

Rody为您提供了repmat解决方案(+1),但我认为值得指出的是:

A = [123;456;789];
A = ones(N, 1) * A';
A = A(:);
Run Code Online (Sandbox Code Playgroud)

将会更快接近一个数量级,因为repmat它不是一个特别有效的功能.10000次迭代的快速测试产生:

Elapsed time is 0.206894 seconds %#repmat solution
Elapsed time is 0.024718 seconds %#My solution
Run Code Online (Sandbox Code Playgroud)

最后一点,我在评论中注意到@ Maroun85建议使用线性索引.但是,我没有看到一个聪明的方法来构建所需的索引而没有调用repmat,这使我们回到原来的减速源.其他人可能会想出一个聪明的方法来构建所需的索引向量.

编辑:罗迪更新了他的答案,提供上述"聪明的方式".:-)