我想优化以下Matlab代码:
x=线性空间(-5,5,100);
Y=线性空间(-5,5,100);
Z=线性空间(-5,5,100);
xp,yp,zp = meshgrid(x,y,z);
范数= sqrt(xp.^2+yp.^2+zp.^2);
我使用realsqrt对其进行了一些改进:
norm_0 = sqrt(xp.^2+yp.^2+zp.^2) 10.106 s 37.0%
norm_1 = realsqrt(xp.^2+yp.^2+zp.^2) 10.100 s 35.0%
还有其他想法吗?
发布于 2010-09-09 14:41:29
sqrt()是昂贵的,所以请确保您确实需要它,或者--正如Jonas所指出的--如果您可以对数据中的radius之前,请使用关于范数对称性的知识来减少sqrt calculations
类似于(未经测试的):
x = linspace(-5, 5, 100);
y = linspace(-5, 5, 100);
z = linspace(-5, 5, 100);
[xp2, yp2, zp2] = meshgrid(x(1:end/2).^2, y(1:end/2).^2, z(1:end/2).^2);
norm_quadrant = sqrt(xp2 + yp2 + zp2);
norm_temp1 = cat(1, norm_quadrant, flipdim(norm_quadrant, 1));
norm_temp2 = cat(2, norm_temp1, flipdim(norm_temp1, 2));
norm_complete = cat(3, norm_temp2, flipdim(norm_temp2, 3));发布于 2010-09-08 13:56:54
我怀疑这条单线是否能得到很好的优化。但是,要花10秒的时间,我猜它是在循环中调用的,这意味着有可能优化整个函数。
此外,你可能试图在某个地方创建一个圆圈,通过阈值半径。与其使用平方根,不如对半径的平方设置阈值,从而使代码更快。
发布于 2010-09-08 13:23:38
只需使用标准的范数函数,它很可能是用C实现的,这使得在Matlab中在多个步骤中完成任何事情都更快。
https://stackoverflow.com/questions/3668080
复制相似问题