2012-02-24 75 views
8

我有一個向量化函數,它可以計算到一大組點的距離。爲了提高性能,我僅通過選擇必要的點來限制點的數量。所以,而不是distanceToPoint(points.x)我使用distanceToPoint(points.x(IDX))。當我繪製所需的計算時間時,我可以看到,當索引部分超過數據的75%時,實際需要更多時間。我能做些什麼來克服這個問題,或者推動性能增益說85%? enter image description here儘量減少向量索引的開銷

編輯:我切換到邏輯索引,明顯好之後增加的結果。它似乎還有偏低%10月底,性能損失(然而可見的,如果你對彼此的頂部查看圖像) enter image description here

+0

是您'IDX'由代表在'points.x'位置的整數或者是一個邏輯陣列? – foglerit 2012-02-24 17:27:14

+0

它們位置的整數從'找到(條件)'函數 – zamazalotta 2012-02-24 17:30:09

+5

代替'find',嘗試返回'IDX = points.x == criteria'(或任何其他定義'IDX'邏輯)。這樣你將創建一個邏輯數組,這在很多情況下會導致更快的索引 – foglerit 2012-02-24 17:36:43

回答

1

我敢肯定,這裏發生了什麼是你的索引方案是服用少量的時間。不管你選擇什麼方法,雖然有更好的方法,但需要一些時間。邏輯總是比使用find語句更好,但也許更好的是直接使用索引。以下是我用於測試內容的一些示例代碼以及結果。注意,我使用2010版運行,我認爲有一些優化發生在較高的值中,但我不確定那裏發生了什麼......很明顯,直接索引似乎比使用邏輯,並且應該比某種查找語句快得多。

function time_test 
time_full_test=zeros(1e3,1); 
time_part_test=zeros(1e3,1); 
time_direct_indexing_full=zeros(1e3,1); 
time_direct_indexing_part=zeros(1e3,1); 
data=rand(1e5,1); 

for i=1:1e3 
    time_full_test(i)=complex_stuff(data); 
    time_part_test(i)=complex_stuff(data,i*100); 
    time_direct_indexing_full(i)=complex_stuff2(data); 
    time_direct_indexing_part(i)=complex_stuff2(data,i*100); 
end 
figure;plot(time_full_test);hold all;plot(time_part_test);plot(time_direct_indexing_full);plot(time_direct_indexing_part) 
legend('Full Time Logic','Part Time Logic','Full Time Direct','Part Time Direct') 

function time=complex_stuff(input,max_val) 
tic 
if ~exist('max_val','var') 
    mask=true(size(input)); 
else 
    mask=false(size(input)); 
    mask(1:max_val)=true; 
end 
sin(input(mask).^2/4356.342).^63/345; 
time=toc; 

function time=complex_stuff2(input,max_val) 
tic 
if ~exist('max_val','var') 
    max_val=length(input); 
end 
sin(input(1:max_val).^2/4356.342).^63/345; 
time=toc; 

enter image description here