2013-04-28 11 views
7

我幾乎是初學者,所以可能以簡單的方式做我想做的事。 我有一個矩陣121x62,但我需要將它擴展到121x1488,所以每列必須重複24次。與每列Matlab:按n次順序重複每一列

2.2668  2.2668  2.2668 and so on to 24th  2.2667  2.2667 and again to 24x 
2.2582  2.2582  2.2582 ... 

:舉例來說,變換此:

2.2668  2.2667  2.2667  2.2666  2.2666  2.2666  
    2.2582  2.2582  2.2582  2.2582  2.2581  2.2581  
    2.283  2.283  2.283  2.2829  2.2829  2.2829  
    2.2881  2.2881  2.2881  2.2881  2.2881  2.288   
    2.268  2.268  2.2679  2.2679  2.2678  2.2678  
    2.2742  2.2742  2.2741  2.2741  2.2741  2.274  

到這一點。

我試圖創建具有這些價​​值的載體,然後用vec2mat變換和好,我有121x1488矩陣,而是由行重複:

2.2668 2.2668 2.2668 2.2668 2.2668 2.2668 ... 2.2582 2.2582 2.2582 2.2582 ... 

如何按列做呢?

+0

你能粘貼與vec2mat轉換的代碼? – 2013-04-28 19:29:02

+0

GPT2 = repmat(ZHD_GPT2(:),1,24); X = vec2mat(GPT2,1488); – papkin 2013-04-28 19:31:15

回答

0

在這裏你去:

function [result] = repcolumn(A, n) 
    %n - how many times each column from A should be repeated 

    [rows columns] = size(A); 
    result = repmat(A(:,1),1,n); 

    for i = 2:columns 
     result = [result,repmat(A(:,i),1,n)]; 
    end 
end 

必須有一個更簡單的方法,但它的工作。

+0

謝謝。它很乾淨,它的工作原理 – papkin 2013-04-28 20:22:35

22

假設你有這個簡化輸入你想擴展列順序n時間:

A = [1 4 
     2 5 
     3 6]; 

szA = size(A); 
n = 3; 

有辦法很少做到這一點:

  • 複製,然後重塑:

    reshape(repmat(A,n,1),szA(1),n*szA(2)) 
    
  • 克羅內克產品:

    kron(A,ones(1,n)) 
    
  • 使用FEX: expand()

    expand(A,[1 n]) 
    
  • 自R2015a,repelem()

    repelem(A,1,n) 
    

所有產生相同的結果:

ans = 
    1  1  1  4  4  4 
    2  2  2  5  5  5 
    3  3  3  6  6  6 
+4

+1對於'kron'解決方案 – Shai 2013-04-29 06:58:34

+0

感謝三種解決方案。對性能有偏好嗎?實際上,我是在一個巨大的循環中做到這一點,這使得演奏非常重要。 – 2014-03-20 09:52:09

+1

@AlirezaMirian複製,重塑應該是最快的。 – Oleg 2014-03-21 08:31:19

1

只是爲了完整。如果你想沿行重複,你也可以使用rectpulse()。

A = [1,2,3;... 
    4,5,6]; 

n = 3; 

rectpulse(A, n); 

給你

1 2 3 
1 2 3 
1 2 3 
4 5 6 
4 5 6 
4 5 6