2013-12-15 198 views
7

如何有效地將矩陣轉換爲矢量向量。 例子:MATLAB:矩陣到矢量行

>> a = [1 2; 3 4] 

a = 

    1  2 
    3  4 

(:)符號給我:

>> a(:) 

ans = 

    1 
    3 
    2 
    4 

,但我想要得到的結果是這樣的:

>> b = a'; b(:) 

ans = 

    1 
    2 
    3 
    4 

的換位和附加無功分配使得它慢得多。 我可以通過整形做沒有分配是這樣的:

>> reshape(a',4,1) 

ans = 

    1 
    2 
    3 
    4 

這是一個非常小的快一點再上一個,看到替補席:

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 

如果我要離開走換位那將是非常非常快和(:)語法爲> 100%的速度:

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像(:),但要獲得行嚮明智! 謝謝

回答

3

想想如何在內存中組織元素。他們的「自然」順序是明智的。因此A(:)只是簡單地改變了矩陣的頭部,但是而不是需要改變存儲元素本身的內存中的東西。但是,當您轉置A時,您需要重新排列內存中的元素(複製和交換),這需要時間。

+0

是的我也想過類似這樣的事情,因爲我知道像Fortran這樣的MATLAB以主要的列格式保存數據在內存中http://en.wikipedia.org/wiki/Row-major_order#Column-major_order,但仍然認爲它可以以某種方式更快地轉換爲矢量 – tim

+1

@bjoern我認爲沒有辦法解決在內存中交換元素的需要。 – Shai