1

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

感谢您的任何意见。

4

1 回答 1

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

但是鉴于循环中的计算结果是相同的(只是求和顺序不同),您可以对整个事物进行矢量化:

function ret = partialsum(x,n,~)
    ii  = 0:n;  
    k   = 2*ii+1;      
    ret = x.^k ./ factorial(k) * (-1).^ii.';
end
于 2013-12-17T15:46:44.903 回答