我想使用双曲正切(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