Optimization 如何在Matlab中优化范数计算?
我想优化以下Matlab代码: x=linspace(-5,5100)Optimization 如何在Matlab中优化范数计算?,optimization,matlab,Optimization,Matlab,我想优化以下Matlab代码: x=linspace(-5,5100) y=linspace(-5,5100) z=linspace(-5,5100) [xp,yp,zp]=meshgrid(x,y,z) 标准=sqrt(xp.^2+yp.^2+zp.^2) 我使用realsqrt对其进行了一些改进: 标准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% 还有其他想法吗
y=linspace(-5,5100)
z=linspace(-5,5100)
[xp,yp,zp]=meshgrid(x,y,z) 标准=sqrt(xp.^2+yp.^2+zp.^2) 我使用realsqrt对其进行了一些改进: 标准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%
还有其他想法吗?只要使用标准范数函数,它很可能是用C实现的,这使得在Matlab中做任何事情都比在许多步骤中更快。只要使用标准范数函数,它很可能是用C实现的,这使得在Matlab中通过许多步骤进行任何操作的速度更快。我怀疑这一行是否可以进行很多优化。然而,如果它需要10秒钟,我猜它是在一个循环中调用的,这表明有可能优化整个函数
此外,您可能会尝试稍后通过设置半径阈值在某处创建一个圆。你可以用半径的平方作为阈值,而不是平方根,这样代码就更快了。我怀疑这一行是否能得到很好的优化。然而,如果它需要10秒钟,我猜它是在一个循环中调用的,这表明有可能优化整个函数 此外,您可能会尝试稍后通过设置半径阈值在某处创建一个圆。不需要平方根,您可以根据半径的平方设置阈值,从而使代码更快。
非常昂贵,所以请确保您确实需要它,或者正如Jonas指出的那样,如果您可以用半径的平方作为阈值的话sqrt()
- 根据您的数据,使用有关范数对称性的知识来减少sqrt计算的数量
- 在生成网格之前预先计算正方形
非常昂贵,所以请确保您确实需要它,或者正如Jonas指出的那样,如果您可以用半径的平方作为阈值的话sqrt()
- 根据您的数据,使用有关范数对称性的知识来减少sqrt计算的数量
- 在生成网格之前预先计算正方形
很抱歉,在这种特殊情况下,我不知道如何获取向量[xp,yp,zp]的元素范数。有什么想法吗?@Oli Charlesworth:
norm
在这里不起作用。如果用数组调用它,norm
返回矩阵范数,而不是向量范数的列表。@乔纳斯:您可以使用norm(X,2,'行')
告诉Matlab获取矩阵X的每一行的向量范数(返回列向量)。反之亦然,如果您传递'cols'
或'columns'
。很抱歉,在这种特殊情况下,我不知道如何获取向量[xp,yp,zp]的元素形式的范数。有什么想法吗?@Oli Charlesworth:norm
在这里不起作用。如果用数组调用它,norm
返回矩阵范数,而不是向量范数的列表。@乔纳斯:您可以使用norm(X,2,'行')
告诉Matlab获取矩阵X的每一行的向量范数(返回列向量)。反之亦然,如果你通过了'cols'
或'columns'
@Jonas:它可以工作,特别是当我在柱面几何中时。@groovingandi:只要我有时间测试,我会的。我会让你知道的。谢谢你的提示。@Jonas:这可能行得通,特别是我在做圆柱几何。@groovingandi:只要我有时间测试一下,我会的。我会让你知道的。谢谢你的提示。
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));