我想知道是否有人有任何改进以下MATLAB代码的性能,演示和/或输出的建议?
我编写了一个程序来使用部分和来近似sin x
((-1)^n)*(x.^((2*n)+1))/(factorial((2*n)+1))
Run Code Online (Sandbox Code Playgroud)
使用方法LS和SL.对于LS,我已经计算并总结了从最大术语到最后一个术语的术语.对于SL,我以相反的顺序完成了计算.
这是我的功能:
function ret = taylorsin(x,n)
ret = ((-1)^n)*(x.^((2*n)+1))/(factorial((2*n)+1));
end
Run Code Online (Sandbox Code Playgroud)
和我的短代码:
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
Run Code Online (Sandbox Code Playgroud)
感谢您的任何意见.
在第一次观看时,有几件事情突出:
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
Run Code Online (Sandbox Code Playgroud)
但是考虑到循环中计算的结果是相同的(只是求和顺序不同),你可以对整个事物进行矢量化:
function ret = partialsum(x,n,~)
ii = 0:n;
k = 2*ii+1;
ret = x.^k ./ factorial(k) * (-1).^ii.';
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
482 次 |
| 最近记录: |