如何在Matlab中优化规范计算?

时间:2010-09-08 13:14:21

标签: optimization matlab

我想优化以下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%

还有其他想法吗?

3 个答案:

答案 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的许多步骤中执行任何操作变得更快。