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
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
@bjoern Suppongo che non ci sia modo per aggirare la necessità di scambiare elementi in memoria. – Shai