2016-08-04 113 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评论并不意味着无礼。了解我有很多事情要做,我写这些东西非常快。那里的问题是要说明他们说的是什么,而提示是真实的。 –