2013-12-15 12 views
7

Come trasformare una matrice in un vettore in senso efficiente per riga. Esempio:MATLAB: da matrice a vettore per riga

>> a = [1 2; 3 4] 

a = 

    1  2 
    3  4 

la notazione (:) mi dà:

>> a(:) 

ans = 

    1 
    3 
    2 
    4 

ma voglio ottenere il risultato come questo:

>> b = a'; b(:) 

ans = 

    1 
    2 
    3 
    4 

Il recepimento e l'ulteriore var assegnazione rende molto più lento. avrei potuto farlo senza l'assegnazione tramite Reshape in questo modo:

>> reshape(a',4,1) 

ans = 

    1 
    2 
    3 
    4 

che è un po 'piccolo più veloce della precedente, vedere la panca:

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 

Se me ne vado via la trasposizione sarebbe molto molto molto più veloce e la sintassi (:) sarebbe> 100% più veloce:

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 

è per questo che sto chiedendo se c'è un bel Synta tale x come (:) ma per ottenerlo in fila per un vettore !? Grazie

risposta

3

Pensa a come gli elementi sono organizzati in memoria. Il loro ordine "naturale" è saggio per le colonne. Pertanto, A(:) cambia semplicemente l'intestazione della matrice ma lo non è necessario modificare la memoria nella memoria che memorizza gli elementi stessi. Tuttavia, quando si traspone A, è necessario riorganizzare gli elementi in memoria (copia e scambio) e questo richiede tempo.

+0

Sì, ho pensato anche a qualcosa del genere, poiché sapevo che MATLAB, come Fortran, conserva i dati in memoria nel formato colonna principale http://en.wikipedia.org/wiki/Row-major_order#Column-major_order, ma ho ancora pensato che sarebbe stato in qualche modo possibile convertire più velocemente in un vettore. – tim

+1

@bjoern Suppongo che non ci sia modo per aggirare la necessità di scambiare elementi in memoria. – Shai

Problemi correlati