2011-03-18 87 views
0

我想知道,什麼是解決一個向量的一個元素更快的服務表現問題:通過MATLAB的矢量處理

result = a(index) 

1)直接訪問)訪問一個元素通過矩陣乘法,例如

a = [1 2 3 4]'; 
b = [0 0 1 0]; 
result = b*a; % Would return 3 

在我的看法(來自「clas sic「編程如C++),第一種方法必須更高性能,因爲直接訪問......第二種方法需要通過兩個向量(?)進行迭代。

爲什麼我問的是原因,MATLAB是矩陣運算和矢量運算非常高性能的,也許我缺少任何方面和第二個方法更有效?

回答

5

簡單的測試:

function [] = fun1() 
a = [1 2 3 4]'; 
b = [0 0 1 0]; 
tic; 
for i=1:1000000 
    r = a(3); 
end 
toc; 
end 

執行時間:0.006秒

變化a(3)b*a

執行時間:0.9秒


的性能差異還是比較明顯的(和你應該做的是自己在問這個問題之前)。背後

原因:

不管高效MATLAB的計算是如何,MATLAB還需要1到取號1和1做乘法1,並總結。沒有希望比單一訪問更快。

在你的特例中,除了1之外都是0,但在我看來,對單個特例進行優化是沒有用的,而且我可以想出的最佳優化仍然需要訪問所有元素每個一次。


編輯:

看來我在相當今天心情好....

變化a(3)a(1)*b(1)+a(2)*b(2)+a(3)*b(3)+a(4)*b(4)

執行時間:0.02秒

看來,邊界檢查(和/ o其他差事)比訪問和計算花費更多的時間。

+0

嗨Dante Jiang,感謝您的非常詳細的回答,它證實了我的建議。而且你的絕對正確,我應該在之前完成這些基準測試,但我甚至不知道matlab有任何方法。坦克很多! – poeschlorn 2011-03-18 13:00:37

+0

@poeschlom:如果您對Matlab性能測試不熟悉,也可以查看「配置文件」功能。 – 2011-03-18 22:21:28

0

爲什麼你認爲乘以零的很多數字將是有效的?即使MATLAB能夠在乘法之前足夠聰明地進行測試,它仍然需要做很多測試。

我在問這個問題有一個觀點,即點積不可能完全有效。即使MATLAB足夠聰明地知道只有一個非零元素,但要知道,它需要搜索非零元素。而且,MATLAB如何足夠聰明地知道你寫的vector * vector dot產品實際上只是爲了訪問一個單一的元素,而不是一個真正的dot產品來達到它所不知道的邪惡目的呢?

0

如何

3)由一個布爾矩陣索引訪問一個元素:

a = [1 2 3 4]'; 
b = [0 0 1 0]; 
result = a(b) 

它幾乎肯定會比更快(2),慢(1)。

+0

這個b不是布爾值;它是一個double,並且會出錯,因爲它正在執行線性索引並嘗試訪問元素0.您想要「b = logical([0 0 1 0]);」。在將它們交給新手之前,請測試代碼片段。 :) – 2011-03-18 22:30:28