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

最初に見たとき、いくつかの点が際立っていました。

  • iiループ変数に MATLAB 組み込み ( )と同じ名前を付けています。
  • logMATLAB 組み込み ( )の名前でもある変数名を使用しています。
  • ループ内のループ変数を変更しています(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 に答える