2012-11-19 135 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 :-)實際上我很感激,因爲我不知道可以用這種方式使用線性索引。 –