2016-08-04 108 views
2

我想使用雙曲正切(Sigmoid)內核計算兩幅圖像之間的歐幾里德距離。請按照this鏈接,我已經詳細討論了使用高斯內核的相同問題。爲大數據優化matlab循環

如果x=(i,j) & y=(i1,j1)是在我們的圖像中的任何兩個像素則雙曲正切內核,我H(x,y)將其定義爲: H(i,j) = tanh(alpha*(x'*y) + c) 其中alphac是參數和x'x轉置。參數alpha可以作爲1/N,其中N是我的圖像尺寸(在我的情況下是8192 x 200),c可以根據問題採取任何值。關於雙曲正切內核的更詳細的描述可以在here找到。

爲了實現我的目標&保持運行時間的考慮,我寫了下面的MATLAB腳本。

gray1=zeros(8192,200); 
gray2=zeros(8192,200); 

s1 = 8192; 
s2 = 200; 

alpha = s1*s2; 

perms = combvec(1:s2,1:s1); 
perms = [perms(2,:);perms(1,:)]'; 
perms1 = perms; 

gray1(4096,100) = 10; 
gray2(10,100) = 10; 
img_diff = gray1 - gray2; 

display('Calculation of Sigmoid Kernel started'); 

for i = 1:length(perms1) 
    kernel = sum(bsxfun(@times,perms,perms1(i,:))'); 
    kernel1 = tanh((1/alpha)*kernel + 1)'; 
    g_temp(i) = img_diff(:)'*kernel1; 
end 

temp = g_temp*img_diff(:); 
ans = sqrt(temp); 

儘管我竭盡全力,我無法進一步對其進行矢量化處理,以降低運行成本。目前,大約需要29個小時才能完成,這對我來說太多了,因爲我想爲各種不同的圖像運行它。我想用一個完全矢量化的形式使用內在的MATLAB函數,就像在高斯內核中由@ dan-man完成的一樣。在他的幫助下,高斯版本需要1-2秒才能完成。在這種情況下,我儘可能使用相同的conv2fft函數,但似乎很難找到實現該方法的方法。

有人可以幫助我刪除一個額外的循環,以獲得算法的運行成本與相同問題的高斯版本相同的比例。

在此先感謝。

+0

你有什麼配置嗎? –

+0

哇,你的for循環是'1638400',這就是很多呃 –

+0

@Ander是的..我已經描繪過它。它只需要花費大約50秒就可以進行780次迭代。因此,對於1638400次迭代,大約需要29個小時。 – nagarwal

回答

1

獲取與matrix-multiplication擺脫討厭循環的 - 在我的電腦

g_temp = img_diff(:).'*tanh((1/alpha)*(perms*perms.')+1) 
+0

對不起,但由於'perms * perms.'會產生一個大小爲1638400 x 1638400的矩陣,因爲內存限制,MATLAB不可能創建這個矩陣。 – nagarwal

1

用我的時間只有50次迭代,代碼需要2.07s

只是改變了bsxfun

kernel = sum(bsxfun(@times,perms,perms1(i,:)),2)'; 

作爲警告建議你可以把它送到1.65s

如果您使用神經網絡工具箱和tansig替代tanh,時間的推移,以1.44s

如果你寫你自己的tanh作爲

kernel1= (2./(1+exp(-2.*((1/alpha)*kernel + 1)))-1)'; 

的時間去1.28s

只要這些改變將意味着從29h噸改善18h


並記住預先分配!

g_temp=zeros(length(perms1),1); 
+0

這是可觀的,但不是我想要的改進。我想再次告訴你,我想迭代它幾張不同的圖像(〜5000),因此希望將運行成本降低到秒,就像在高斯內核情況下由@ dan-man完成的那樣。 – nagarwal

+0

感謝您的粗魯和無禮的評論。我已經報道過了。生活小貼士:有時候你可以解決問題,有時你不能。如果你不能做到這一點,你不能爲問題解決方案提供「不存在」證書。與此同時,stackoverflow是討論和解決曾經看起來不可能的事情的平臺,並不涉及與一些自私的傢伙的爭執。 – nagarwal

+0

@nagarwal評論並不意味着無禮。瞭解我有很多事情要做,我寫這些東西非常快。那裏的問題是要說明他們說的是什麼,而提示是真實的。 –