2013-12-15 30 views
7

Matrisin bir vektöre verimli bir şekilde nasıl dönüştürüleceği. Örnek: (:) notasyonu bana verirMATLAB: Matrix to Vector row-wise

>> a = [1 2; 3 4] 

a = 

    1  2 
    3  4 

:

>> b = a'; b(:) 

ans = 

    1 
    2 
    3 
    4 

aktarılması ve ek var atama yapar:

>> a(:) 

ans = 

    1 
    3 
    2 
    4 

ama bu kadar sonuç almak istiyoruz çok daha yavaş. Böyle reshape yoluyla atama olmadan yapabileceğini: çok küçük biraz daha hızlı bir öncekinden daha sonra

>> reshape(a',4,1) 

ans = 

    1 
    2 
    3 
    4 

, tezgah bkz:

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 

uzakta gidiyorum varsa aktarılması çok çok daha hızlı olacak ve (:) sözdizimi>% 100 daha hızlı olacaktır: böyle güzel Synta varsa yüzden soruyorum var

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 

x (:) gibi ama bir vektör için satır-yanına almak !? Teşekkürler

cevap

3

Öğelerin bellekte nasıl düzenlendiğini düşünün. Onların "doğal" düzeni sütun bilge. Bu nedenle A(:) sadece matrisin başlığını değiştirir, ancak 'un elemanların kendilerini sakladığı hafızada yeni bir şey değiştirmesi gerekir. Ancak, A'u aktardığınızda, öğeleri bellekteki (kopyalama ve takas) yeniden düzenlemeniz gerekir ve bu da zaman alır.

+0

evet ben de böyle bir şey düşünmüştüm, bildiğim gibi, MATLAB, fortran gibi, verileri ana sütun formatında bellekte tutuyordu http://en.wikipedia.org/wiki/Row-major_order#Column-major_order, ama yine de bir vektöre daha hızlı dönüşebileceğini düşünmüştüm. – tim

+1

@bjoern Sanırım hafızada öğeleri değiştirmenin bir yolu yok. – Shai