【问题标题】:How to optimize norm calculation in Matlab?Matlab中如何优化范数计算?
【发布时间】:2025-11-27 12:30:01
【问题描述】:

我想优化以下 Matlab 代码:

x = linspace(-5,5,100);
y = linspace(-5,5,100);
z = linspace(-5,5,100);
[xp,yp,zp] = 网格网格(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%

还有其他想法吗?

【问题讨论】:

    标签: optimization matlab


    【解决方案1】:
    • sqrt() 很昂贵,因此请确保您确实需要它,或者 - 正如 Jonas 指出的那样 - 如果您可以改为以半径的平方为阈值

    • 根据你的数据,利用范数对称性的知识来减少sqrt计算的次数

    • 在生成网格之前预先计算正方形

    类似(未经测试):

    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));
    

    【讨论】:

    • @Jonas:它可以工作,尤其是当我在圆柱几何中时。
    • @groovingandi:只要我有时间对此进行测试,我就会。我会让你知道。感谢您的提示。
    【解决方案2】:

    我怀疑这条单独的线路是否可以优化得非常好。但是,它需要 10 秒,我猜它是在循环内调用的,这表明有可能优化整个函数。

    此外,您稍后可能会尝试通过对半径进行阈值化来创建一个圆。除了取平方根之外,您还可以根据半径的平方来设置阈值,从而使代码更快。

    【讨论】:

      【解决方案3】:

      只要使用标准的 norm 函数,它可能是用 C 实现的,这使得在 Matlab 中多步做任何事情都更快。

      【讨论】:

      • 抱歉,在这种特殊情况下,我不知道如何按元素获取向量 [xp,yp,zp] 的范数。有什么想法吗?
      • @Oli Charlesworth:norm 在这里不起作用。如果您使用数组调用它,norm 返回一个矩阵范数,而不是向量范数列表。
      • @Jonas:您可以使用norm(X, 2, 'rows') 告诉Matlab 对矩阵X 的每一行取一个向量范数(返回一个列向量)。如果你通过'cols''columns',反之亦然。