精度の引き下げによる速度の向上
計算精度を下げて MATLAB® の速度を引き上げます。精度を下げるには、Symbolic Math Toolbox™ の関数 vpa
と digits
で提供される可変精度演算を使用します。精度を下げることで正確度は低下しますが、動作性能が向上します。詳細は、数値演算またはシンボリック演算の選択を参照してください。
たとえば、大規模行列 C
のリーマン ゼータ関数を求めるのは時間がかかります。最初に、C
を初期化します。
[X,Y] = meshgrid((0:0.0025:.75),(5:-0.05:0)); C = X + Y*i;
その際、zeta(C)
の計算に要する時間がわかります。
tic zeta(C); toc
Elapsed time is 340.204407 seconds.
ここで、vpa
を使用して精度を下げ、この演算を繰り返します。まず、digits
を使用して vpa
で使用する精度を 10
桁に引き下げる変更を行います。次に、vpa
を使用して、C
の精度を引き下げて再度 zeta(C)
を求めます。演算が大幅に高速化します。
digits(10) vpaC = vpa(C); tic zeta(vpaC); toc
Elapsed time is 113.792543 seconds.
メモ
vpa
の出力はシンボリックです。シンボリック値を受け取らない MATLAB 関数でシンボリック出力を使用するには、double
を使用してシンボリック値を倍精度に変換します。
行列が大きいほど計算時間の差も非常に大きくなります。たとえば、次のような 1001
行 301
列の行列 C
を考えます。
[X,Y] = meshgrid((0:0.0025:.75),(5:-0.005:0)); C = X + Y*i;
10 桁の精度で zeta(vpa(C))
を実行すると、15 分かかりますが、zeta(C)
の実行はその 3 倍の時間がかかります。
digits(10) vpaC = vpa(C); tic zeta(vpaC); toc
Elapsed time is 886.035806 seconds.
tic zeta(C); toc
Elapsed time is 2441.991572 seconds.
メモ
精度を "引き上げる" 場合は、数値計算精度の引き上げを参照してください。