2

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

A= [123
    456
    789];

所以我想要:

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

我试过了repmat

B = repmat(A,3,1)

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

4

2 回答 2

5

罗迪为您提供了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,这使我们回到了减速的原始根源。不过,其他人可能会想出一个聪明的方法来构造所需的索引向量。

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

于 2012-11-19T09:15:38.480 回答
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]);

这有时非常有用。

于 2012-11-19T09:07:23.947 回答