我想使用雙曲正切(Sigmoid)內核計算兩幅圖像之間的歐幾里德距離。請按照this鏈接,我已經詳細討論了使用高斯內核的相同問題。爲大數據優化matlab循環
如果x=(i,j)
& y=(i1,j1)
是在我們的圖像中的任何兩個像素則雙曲正切內核,我H(x,y)
將其定義爲: H(i,j) = tanh(alpha*(x'*y) + c)
其中alpha
和c
是參數和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
函數,但似乎很難找到實現該方法的方法。
有人可以幫助我刪除一個額外的循環,以獲得算法的運行成本與相同問題的高斯版本相同的比例。
在此先感謝。
你有什麼配置嗎? –
哇,你的for循環是'1638400',這就是很多呃 –
@Ander是的..我已經描繪過它。它只需要花費大約50秒就可以進行780次迭代。因此,對於1638400次迭代,大約需要29個小時。 – nagarwal