首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >针对大数据优化matlab循环

针对大数据优化matlab循环
EN

Stack Overflow用户
提问于 2016-08-04 22:35:58
回答 1查看 91关注 0票数 2

我想使用双曲正切(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是我的图像尺寸(在我的例子中是8192x200),c可以根据问题取任何值。关于双曲正切核的更详细的描述可以在here中找到。

为了实现我的目标&将运行时间控制在考虑范围之内,我编写了以下MATLAB脚本。

代码语言:javascript
复制
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循环,这样算法的运行成本就和高斯版本的相同了。

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2016-08-04 22:56:38

使用matrix-multiplication摆脱讨厌的循环-

代码语言:javascript
复制
g_temp = img_diff(:).'*tanh((1/alpha)*(perms*perms.')+1)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38770375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档