我想知道是否有人建议改进以下MATLAB代码的性能,演示和/或输出?
我编写了一个使用部分和来近似sin x的程序
((-1)^n)*(x.^((2*n)+1))/(factorial((2*n)+1))
使用方法LS和SL。对于LS,我已经计算并总结了从最大术语到最后一个术语的术语。对于SL,我以相反的顺序完成了计算。
这是我的功能:
function ret = taylorsin(x,n)
ret = ((-1)^n)*(x.^((2*n)+1))/(factorial((2*n)+1));
end
和我的短代码:
function ret = partialsum(x,n,log)
ret = 0;
if log == 1
for i = 0:1:n
ret = ret + taylorsin(x,i);
i=i+1;
end
elseif log == 0
for i = n:-1:0
ret = ret + taylorsin(x,i);
i = i+1;
end
end
end
感谢您的任何意见。
答案 0 :(得分:5)
首次观看时,有几件事情很突出:
ii
)log
)ii=ii+1
不是必需的)taylorsin
函数(函数调用非内置函数可能很难JIT)log
的其他值(这会咬你)因此,快速改进将是:
function ret = partialsum(x,n,lg)
ret = 0;
if lg == 1
for ii = 0:n
N = cumprod(2 : 2*ii+1);
ret = ret + (-1)^ii * (x^(2*ii+1))/N(end);
end
elseif lg == 0
for ii = n:-1:0
N = cumprod(2 : 2*ii+1);
ret = ret + (-1)^ii * (x^(2*ii+1))/N(end);
end
else
error('Invalid value for lg');
end
但是考虑到循环中计算的结果是相同的(只是求和顺序不同),你可以对整个事物进行矢量化:
function ret = partialsum(x,n,~)
ii = 0:n;
k = 2*ii+1;
ret = x.^k ./ factorial(k) * (-1).^ii.';
end