【问题标题】:Suggestions to improve MATLAB code?改进 MATLAB 代码的建议?
【发布时间】:2014-01-05 10:53:12
【问题描述】:

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

感谢您的任何意见。

【问题讨论】:

    标签: matlab taylor-series


    【解决方案1】:

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

    • 您正在为循环变量提供与 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 我将使用repmatn 列式和x 行式进行矢量化,然后使用cumsum 列式
    • 我在一般情况下认为x是一个向量
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 2017-09-16
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多