2012-11-19 155 views
2

我不想重复每一行n次,比如:平铺矩阵行通过

A= [123 
    456 
    789]; 

,所以我想有:

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

我已经试过repmat

B = repmat(A,3,1) 

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

+0

您可以重复要重复的行的索引。 – Maroun

+0

这不是一个包含脸书的问题,请使用正确的标签 – luschn

+1

为什么人们对此表示不满?你至少应该发表评论,说出你为什么倒计时! – Vivi

回答

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), :); 

这是有点难以阅读,所以包括一个注释行描述它在你使用这个时做了什么。

而且看看克罗内克产品:

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

它有时可以是非常有用的。

+0

我认为你的意思是在第二行Rody中加入一个'A =':-) –

+0

@ColinTBowers:yup,编辑。Tnx –

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,这会使我们回到原来的减速源。其他人可能会想出一个聪明的方法来构建所需的索引向量。

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

+0

+1乘以1是一个很好的替代'repmat',但是,它只适用于向量'A' –

+0

好主意,但我用它在我的答案:) –

+0

@RodyOldenhuis没有probs :-)实际上我很感激,因为我不知道可以用这种方式使用线性索引。 –