Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization 如何在Matlab中优化范数计算?_Optimization_Matlab - Fatal编程技术网

Optimization 如何在Matlab中优化范数计算?

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% 还有其他想法吗

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


还有其他想法吗?

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

只要使用标准范数函数,它很可能是用C实现的,这使得在Matlab中通过许多步骤进行任何操作的速度更快。

我怀疑这一行是否可以进行很多优化。然而,如果它需要10秒钟,我猜它是在一个循环中调用的,这表明有可能优化整个函数


此外,您可能会尝试稍后通过设置半径阈值在某处创建一个圆。你可以用半径的平方作为阈值,而不是平方根,这样代码就更快了。

我怀疑这一行是否能得到很好的优化。然而,如果它需要10秒钟,我猜它是在一个循环中调用的,这表明有可能优化整个函数

此外,您可能会尝试稍后通过设置半径阈值在某处创建一个圆。不需要平方根,您可以根据半径的平方设置阈值,从而使代码更快。

  • sqrt()
    非常昂贵,所以请确保您确实需要它,或者正如Jonas指出的那样,如果您可以用半径的平方作为阈值的话

  • 根据您的数据,使用有关范数对称性的知识来减少sqrt计算的数量

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

类似于(未经测试):

  • sqrt()
    非常昂贵,所以请确保您确实需要它,或者正如Jonas指出的那样,如果您可以用半径的平方作为阈值的话

  • 根据您的数据,使用有关范数对称性的知识来减少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));