我想重复每一行n次,例如:
A= [123
456
789];
所以我希望:
b=[123
123
123
456
456
456
789
789
789];
我试过repmat
:
B = repmat(A,3,1)
但这不会导致上面的b
......我该怎么做?
答案 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已经更新了他的答案,以提供上述“聪明的方式”。 : - )