我想优化以下Matlab代码:
x = linspace(-5,5,100);
y = linspace(-5,5,100);
z = linspace(-5,5,100);
[xp,yp,zp] = meshgrid(x,y,z);norm = 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%
还有其他想法吗?
答案 0 :(得分:3)
sqrt()
价格昂贵,所以请确保你确实需要它,或者 - 正如Jonas指出的那样 - 如果你可以改为对半径的平方进行阈值
取决于您的数据,使用有关规范对称性的知识来减少sqrt计算的数量
在生成meshgrid之前预先计算正方形
类似(未经测试):
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));
答案 1 :(得分:1)
我怀疑这条线可以非常优化。然而,因为它需要10秒钟,我猜它在一个循环中调用,这表明有可能优化整个函数。
此外,您可能会尝试稍后通过阈值处理来创建一个圆。而不是取平方根,你可以改为对半径的平方进行阈值,并使代码更快。
答案 2 :(得分:0)
只需使用标准规范函数,它可能是使用C实现的,这使得在Matlab的许多步骤中执行任何操作变得更快。