建议改进MATLAB代码?

时间:2013-12-17 15:32:46

标签: matlab taylor-series

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

感谢您的任何意见。

1 个答案:

答案 0 :(得分: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