Main Content

精度の引き下げによる速度の向上

計算精度を下げて MATLAB® の速度を引き上げます。精度を下げるには、Symbolic Math Toolbox™ の関数 vpadigits で提供される可変精度演算を使用します。精度を下げることで正確度は低下しますが、動作性能が向上します。詳細は、数値演算またはシンボリック演算の選択を参照してください。

たとえば、大規模行列 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 を使用してシンボリック値を倍精度に変換します。

行列が大きいほど計算時間の差も非常に大きくなります。たとえば、次のような 1001301 列の行列 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.

メモ

精度を "引き上げる" 場合は、数値計算精度の引き上げを参照してください。