针对大数据优化matlab for循环

时间:2016-08-04 14:35:58

标签: matlab kernel bsxfun hyperbolic-function

我想使用双曲正切(Sigmoid)内核计算两个图像之间的欧几里德距离。请关注this链接,我已经详细讨论了使用高斯内核的相同问题。

如果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可以根据问题取任何值。可以找到关于Hyperbolic Tangent内核的更详细描述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循环,以便获得算法的运行成本与相同问题的高斯版本相同的比例。

提前致谢。

2 个答案:

答案 0 :(得分:1)

使用matrix-multiplication -

摆脱令人讨厌的循环
g_temp = img_diff(:).'*tanh((1/alpha)*(perms*perms.')+1)

答案 1 :(得分:1)

我的PC在我的PC上只进行了50次迭代,代码需要date

只需将2.07s行更改为

即可
bsxfun

警告提示您可以将其转到kernel = sum(bsxfun(@times,perms,perms1(i,:)),2)';

如果您使用神经网络工具箱并将1.65s替换为tanh,则时间将转到tansig

如果您自己编写1.44s

tanh

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

这些更改意味着从1.28s29h

的改进

记得要预先分配!

18h