2013-04-28 15 views
7

Jestem prawie początkującym, więc prawdopodobnie można robić to, co chcę w prosty sposób. Mam macierz 121x62, ale muszę ją rozszerzyć do 121x1488, więc każda kolumna musi być powtarzana 24 razy. Na przykład, przekształcać to:Matlab: powtarzaj każdą kolumnę sekwencyjnie n razy

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  

do tego:

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 ... 

z każdej kolumny.

Próbowałem stworzyć wektor z tych wartości, a następnie przekształcić z vec2mat i ok mam 121x1488 matrycę ale powtarzane przez rzędów:

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

Jak to zrobić przez kolumn?

+0

You Could wkleić kod z transformacją vec2mat? –

+0

GPT2 = repmat (ZHD_GPT2 (:), 1,24); X = vec2mat (GPT2,1488); – papkin

Odpowiedz

0

tu proszę:

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 

Musi być łatwiejszy sposób, ale spełnia swoje zadanie.

+0

Dziękuję. Jest wystarczająco czysty i działa – papkin

22

Przypuśćmy, że masz uproszczoną wejście i chcesz poszerzyć kolumny kolejno n razy:

A = [1 4 
     2 5 
     3 6]; 

szA = size(A); 
n = 3; 

Istnieje kilka sposobów, aby to zrobić:

  • Replikacja, a następnie przekształcenia:

    reshape(repmat(A,n,1),szA(1),n*szA(2)) 
    
  • Kronecker produktu

    kron(A,ones(1,n)) 
    
  • Stosując FEX: expand():

    expand(A,[1 n]) 
    
  • Ponieważ R2015a, repelem():

    repelem(A,1,n) 
    

Wszystkie uzyskując ten sam wynik:

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

+1 dla 'kron'u rozwiązania – Shai

+0

Dzięki za trzy rozwiązania. Czy są jakieś preferencje dotyczące wydajności? Właściwie robię to w ogromnej pętli, która sprawia, że ​​wykonanie jest dość ważne. –

+1

@AlirezaMirian Replicate, zmiana kształtu powinna być najszybsza. – Oleg

1

Tylko ze względu na kompletność. Jeśli chcesz duplikować wzdłuż wierszy, możesz również użyć rectpulse().

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

n = 3; 

rectpulse(A, n); 

daje

1 2 3 
1 2 3 
1 2 3 
4 5 6 
4 5 6 
4 5 6 
Powiązane problemy