通过删除循环简化功能

时间:2017-12-20 16:11:00

标签: matlab loops optimization

通过摆脱循环来简化函数的最佳方法是什么?

$uid = uniqid().date("Ymdhhis");

有没有办法使用任何类似矢量的解决方案而不是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 循环?

1 个答案:

答案 0 :(得分:3)

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

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喜欢处理逐个元素的操作,所以关键是用forW中的所有元素来缩放最后的X循环循环中看到的缩放因子。此外,使用逐元素乘法(.*)是关键。这当然假设f可以以元素方式处理事物。如果没有,则无法避免for循环。

我强烈建议您在开始MATLAB之旅之前咨询关于元素操作的MATLAB教程:https://www.mathworks.com/help/matlab/matlab_prog/array-vs-matrix-operations.html