建议改进MATLAB代码?

1 matlab taylor-series

我想知道是否有人有任何改进以下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)

感谢您的任何意见.

Rod*_*uis 5

在第一次观看时,有几件事情突出:

  • 你给你的循环变量与MATLAB内置的同名(ii)
  • 你使用的是一个变量名,它也是MATLAB内置的名字(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)