この動作は、のドキュメントの「制限事項」セクションで説明されており、「特異行列の行列式の検索」サブセクションで例が示されています。det
が特異A
であるにもかかわらず、の行列式は非常に大きい。A
実際、 の行列式はA
正確にゼロでなければなりません! の不正確さは、行列式の計算に使用されるd
LU 分解の MATLAB® 実装における丸め誤差の集計によるものです。det
とはいえ、この例では、同じページに示されているm コードの実装を使用して、対角要素を昇順に並べ替えることで、目的の結果を生成できます。サンプル スクリプトを検討してください。U
clc();
clear();
A = rand(500,1500);
b = rand(500,1);
c = (A.')*A;
[L,U] = lu(c);
% Since det(L) is always (+/-)1, it doesn't impact anything
diagU = diag(U);
detU1 = prod(diagU);
detU2 = prod(sort(diagU,'descend'));
detU3 = prod(sort(diagU,'ascend'));
fprintf('Minimum: %+9.5e\n',min(abs(diagU)));
fprintf('Maximum: %+9.5e\n',max(abs(diagU)));
fprintf('Determinant:\n');
fprintf('\tNo Sort: %g\n' ,detU1);
fprintf('\tDescending Sort: %g\n' ,detU2);
fprintf('\tAscending Sort: %g\n\n',detU3);
これにより、次の出力が生成されます。
Minimum: +1.53111e-13
Maximum: +1.72592e+02
Determinant:
No Sort: Inf
Descending Sort: Inf
Ascending Sort: 0
Inf
並べ替えの方向が重要であり、対角線上にtrue0
が存在しないため、並べ替えなしで得られることに注意してください。降順の並べ替えでは、最初に乗算された最大値が表示されます。明らかに、それらrealmax
は true を超えて乗算されず、 .0
が生成されNaN
ます。昇順の並べ替えでは、ほとんどゼロに近い対角値がすべてまとめられ、大きな負の値はほとんどありません (実際には、より堅牢な方法では大きさに基づいて並べ替えますが、ここでは行われませんでした)、それらの乗算により true が生成されます0
(つまり、この値は、「正しい」結果を生成する IEEE-754 演算で使用可能な最小の非正規化数を下回っています。
書かれたすべてのこと、および他の人が暗示しているように、元の Matlab 開発者であり、Mathworks の共同創設者である Cleve Moler を引用します。
[行列式] は、理論的な考察や手計算には役立ちますが、堅牢な数値ソフトウェアの健全な基礎にはなりません。