2013-12-15 10 views
7

Jak sprawnie przekształcić macierz w wektor. Przykład:MATLAB: Macierz do wektora wierszowego

>> a = [1 2; 3 4] 

a = 

    1  2 
    3  4 

notacja (:) daje mi:

>> a(:) 

ans = 

    1 
    3 
    2 
    4 

ale chcę, aby uzyskać wynik jak to:

>> b = a'; b(:) 

ans = 

    1 
    2 
    3 
    4 

Transpozycja i dodatkowy var przypisanie czyni go znacznie wolniej. mogę to zrobić bez przypisania poprzez przekształcić tak:

>> reshape(a',4,1) 

ans = 

    1 
    2 
    3 
    4 

który jest bardzo mały nieco szybciej niż poprzedni, zobaczyć z ławki:

runs = 1000; 
num = 1000; 
A = rand(num); 

times = zeros(runs, 2); 
for i = 1:runs 
    tic 
    x = A'; 
    x = x(:); 
    t1 = toc; 
    x = reshape(A',size(A,1)*size(A,2),1); 
    t2 = toc-t1; 
    times(i,:) = [t1 t2];  
end 
format shortG 
mt = mean(times) 

mt = 

    0.0037877 0.0037699 

Jeśli wyjeżdżam z dala transpozycja byłoby bardzo dużo szybsze i składnia (:) byłoby> 100% szybciej:

runs = 100; 
num = 5000; 
A = rand(num); 

times = zeros(runs, 2); 
for i = 1:runs 
    tic 
    x = A(:); 
    t1 = toc; 
    x = reshape(A,size(A,1)*size(A,2),1); 
    t2 = toc-t1; 
    times(i,:) = [t1 t2];  
end 
format shortG 
mt = mean(times) 

mt = 

    3.307e-07 8.8382e-07 

dlatego pytam, czy jest taki ładny Synta x lubię (:), ale po to, aby uzyskać wiersz zgodny z wektorem !? Dzięki

Odpowiedz

3

Pomyśl o tym, jak elementy są uporządkowane w pamięci. Ich "naturalny" porządek jest uporządkowany w kolumnach. Zatem A(:) po prostu zmienia nagłówek macierzy, ale wymaga zmiany jednostki w pamięci przechowującej same elementy. Jednak podczas transpozycji A należy ponownie rozmieścić elementy w pamięci (kopiowanie i zamianę), co wymaga czasu.

+0

Tak, myślałem o czymś takim również, ponieważ wiedziałem, że MATLAB, podobnie jak fortran, przechowuje dane w pamięci w głównym formacie kolumnowym http://en.wikipedia.org/wiki/Row-major_order#Column-major_order, ale wciąż myślałem, że w jakiś sposób będzie możliwe przekonwertowanie na wektor szybciej – tim

+1

@ bjoern Przypuszczam, że nie ma potrzeby wymieniania elementów w pamięci. – Shai

Powiązane problemy