1

これは、宿題として得た問題に対して私が書いた私の matlab コードです。A の乗算とその転置の後、結果の正方行列は、すべてのクラスメートのコード (異なるコード) に応じて行列式がゼロになるはずです。コードが c と d の行列式を無限大にしないのはなぜですか

A = rand(500,1500);

b = rand(500,1);

c = (A.')*A;

detc = det(c);

cinv = inv((A.')*A);

d = A*(A.');

detd = det(d);

dinv = inv(A*(A.'));

x1 = (inv((A.')*A))*((A.')*b);

x2 = A.'*((inv(A*(A.')))*b);
4

3 に答える 3

3

この動作は、のドキュメントの「制限事項」セクションで説明されており、「特異行列の行列式の検索」サブセクションで例が示されています。det

が特異Aであるにもかかわらず、の行列式は非常に大きい。A実際、 の行列式はA正確にゼロでなければなりません! の不正確さは、行列式の計算に使用されるdLU 分解の 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 を引用します。

[行列式] は、理論的な考察や手計算には役立ちますが、堅牢な数値ソフトウェアの健全な基礎にはなりません。

于 2016-03-14T01:23:40.747 に答える
0

これは丸めの問題にすぎないと思います. Inf は、答えとして Infinity を取得していることを意味するものではありません.行列式が本当に大きく、 を超えてrealmaxいる. アディエルが言ったように、A*A. 対称行列を生成し、その行列式に数値が必要です。たとえば、次のように設定します。

A=rand(5,15)

A*A の詳細がわかるはずです。は単なる数値です。

それで、あなたの友人はどのようにしてゼロを取得しましたか。det大きな行列の場合、0またはinfを取得するのは簡単です(そもそもなぜこれを行うのか、私には手がかりがありません)。したがって、同じ/同様の丸めの問題が発生していると思います。

于 2016-03-13T14:48:33.727 に答える