是否有人能够帮助我提高下面代码的速度,这需要太长时间。问候。
limits(1) = 3.2;
limits(3) = 3.6;
x = ones(426,1);
y = ones(426,1);
BandWidth = 20;
height = 586;
width = 896;
dmap = zeros(height, width);
parfor jj = 0 : width - 1
myTemp = zeros(1, height);
xi = limits(1) + jj;
for ii = 0: height - 1
yi = limits(3) + ii;
myTemp(ii+1) = sum( exp(-((x - xi).^2 + (y - yi).^2)/(2*BandWidth^2)) );
end
dmap(:,jj+1) = myTemp';
end
dmap = (1/(sqrt(2*pi)*BandWidth))*dmap;
期待听到一些提示。
答案 0 :(得分:0)
减小尺寸。 e.g:
身高= 128; width = 192
准确度相似但性能时间会更短。
答案 1 :(得分:0)
这个实际上使用矢量化非常好地加速(注意使用bsxfun
)。我使用exp(A+B)=exp(A)*exp(B)
分别为exp(-(x-xi)^2/(2*BandWidth^2))
和x
计算y
这一事实,然后通过正常矩阵乘法处理求和,这是另一个不错的技巧。您的原始代码在我的计算机上运行~5.5秒,此代码需要约0.07秒。对于x
和y
附近的3.2
和3.6
,您确实会失去一点精确度,但差异仍然低于1e-14
。我的预感是由于exp(A+B)
和exp(A)*exp(B)
之间的舍入错误。
limits(1) = 3.2;
limits(3) = 3.6;
x = ones(426,1);
y = ones(426,1);
BandWidth = 20;
height = 586;
width = 896;
xi=limits(1)+(0:width-1);
yi=limits(3)+(0:height-1);
X=exp(-bsxfun(@minus,x,xi).^2/(2*BandWidth^2));
Y=exp(-bsxfun(@minus,y,yi).^2/(2*BandWidth^2));
dmap=Y.'*X/(sqrt(2*pi)*BandWidth);