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
性能较慢。对于这个小阵列,您可能看不到它,但对于更大的阵列,您肯定会看到性能下降。