改进MATLAB代码的建议?

改进MATLAB代码的建议?,matlab,taylor-series,Matlab,Taylor Series,我想知道是否有人对改进以下MATLAB代码的性能、表示和/或输出有任何建议 我写了一个程序,用部分和来近似sinx ((-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)); e

我想知道是否有人对改进以下MATLAB代码的性能、表示和/或输出有任何建议

我写了一个程序,用部分和来近似sinx

((-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

感谢您的宝贵意见。

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

  • 您给循环变量的名称与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

在第一次观看时,有两件事非常突出:

  • 您给循环变量的名称与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

+1我将使用
repmat
n
列方式和
x
行方式进行向量化,然后使用
cumsum
列方式我认为在一般情况下,
x
是向量+1我将使用
repmat
n
列方式和
x
行方式进行向量化,然后使用
cumsum
columnwise我在一般情况下认为
x
是一个向量