平铺矩阵逐行

时间:2012-11-19 08:42:24

标签: matlab

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

A= [123
    456
    789];

所以我希望:

b=[123
   123
   123
   456
   456
   456
   789
   789
   789];

我试过repmat

B = repmat(A,3,1)

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

2 个答案:

答案 0 :(得分:5)

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

A = [123;456;789];
A = repmat(A.', 3, 1);
A = A(:);

更一般地说,对于任何矩阵/张量,在索引上使用repmat

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

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

A = A( ones(3,1) * (1:end), :);

这有点难以阅读,因此请添加一条注释行,说明使用此功能时的操作。

另请参阅Kronecker产品:

A = kron(A, [1;1;1]);

这有时非常有用。

答案 1 :(得分:5)

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

A = [123;456;789];
A = ones(N, 1) * A';
A = A(:);

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

Elapsed time is 0.206894 seconds %#repmat solution
Elapsed time is 0.024718 seconds %#My solution

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

编辑: Rody已经更新了他的答案,以提供上述“聪明的方式”。 : - )