Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
Matlab 通过消除循环简化函数_Matlab_Loops_Optimization - Fatal编程技术网

Matlab 通过消除循环简化函数

Matlab 通过消除循环简化函数,matlab,loops,optimization,Matlab,Loops,Optimization,通过消除循环来简化函数的最佳方法是什么 function Q = gs(f, a, b) X(4) = sqrt((3+2*sqrt(6/5))/7); X(3) = sqrt((3-2*sqrt(6/5))/7); X(2) = -sqrt((3-2*sqrt(6/5))/7); X(1) = -sqrt((3+2*sqrt(6/5))/7); W(4) = (18-sqrt(30))/36; W(3) = (18+sqrt(30))/36; W(2) = (18+sqrt(30))/36

通过消除循环来简化函数的最佳方法是什么

function Q = gs(f, a, b)

X(4) = sqrt((3+2*sqrt(6/5))/7);
X(3) = sqrt((3-2*sqrt(6/5))/7);
X(2) = -sqrt((3-2*sqrt(6/5))/7);
X(1) = -sqrt((3+2*sqrt(6/5))/7);

W(4) = (18-sqrt(30))/36;
W(3) = (18+sqrt(30))/36;
W(2) = (18+sqrt(30))/36;
W(1) = (18-sqrt(30))/36;
Q = 0;
for i = 1:4
   W(i) = (W(i)*(b-a))/2;
   X(i) = ((b-a)*X(i)+(b+a))/2;
   Q = Q + W(i) * f(X(i));
end


end
对于循环,是否有任何方法可以使用类似向量的解决方案而不是

是您最好的朋友。此外,声明一些常量和创建向量也很有用:

function Q = gs(f, a, b)
c = sqrt((3+2*sqrt(6/5))/7);
d = sqrt((3-2*sqrt(6/5))/7);
e = (18-sqrt(30))/36;
g = (18+sqrt(30))/36;

X = [-c -d d c];
W = [e g g e];

W = ((b - a) / 2) * W;
X = ((b - a)*X + (b + a)) / 2;
Q = sum(W .* f(X));

end
请注意,MATLAB喜欢处理元素操作,因此关键是用循环中看到的缩放因子缩放
W
X
中的所有元素来替换最后的
for
循环。此外,使用元素级乘法(
*
)是关键。当然,这假设
f
可以以元素方式处理事情。如果没有,则无法避免
for
循环


我强烈建议您在开始MATLAB之旅之前,先查阅MATLAB关于元素操作的教程:

(我对MATLAB的工作原理有模糊的记忆,但是)你可以生成W和X向量,然后将它们与所需的值相乘。我的答案有帮助吗?在代码的第5行,你给
f
分配了一个标量数值,但在
end
之前的最后一行,你写了
f(X)
-这是打字错误吗?@nekomatic是的。谢谢我已经更改了其中一个变量,因此,如果
f
只能处理标量输入,那么仍然可以使用
Q=sum(W.*arrayfun(f,X))
@nekomatic避免显式循环,我仍然会使用循环
arrayfun
性能较慢。对于这个小阵列,您可能看不到它,但对于更大的阵列,您肯定会看到性能下降。