JAMAを使用するプログラムがあり、行列を反転できるかどうかをテストする必要があります。私はそれを試して例外をキャッチできることを知っていますが、それは悪い考えのようです(「通常の」コードパスの一部としてcatchブロックを持つことは悪い形式のようです)。
逆関数も返す(または逆演算よりも優れたO()で実行する)テストが推奨されます。
JAMAを使用するプログラムがあり、行列を反転できるかどうかをテストする必要があります。私はそれを試して例外をキャッチできることを知っていますが、それは悪い考えのようです(「通常の」コードパスの一部としてcatchブロックを持つことは悪い形式のようです)。
逆関数も返す(または逆演算よりも優れたO()で実行する)テストが推奨されます。
一般に、行列を解くことができない場合、それは単一(反転不可)です。JAMAがこれを行う方法は、LU分解を使用して行列を解こうとすることであり、失敗した場合は、isSingular()に対して「true」を返します。
行列の要素を調べて、それが特異であるかどうかを判断する一般的な方法は実際にはありません。各列をチェックして、他の列と直交しているかどうかを確認する必要があります(つまり、行列の零空間は0です)。LU分解は非常に高速ですが、通常は...操作の大部分を占める場合があります。
克服しようとしている実際の速度の問題がありますか?
例外がスローされた場合、回復位置は?
LU 分解を行って特異であることがわかった場合、例外をキャッチして、代わりに SVD (特異値分解) を試しますか?
条件数の逆数を推定したいようです。
このサイトはやや有望に見えます...
Golub と Van Loanも参照してください。128-130。(コピーをお持ちでない場合は、入手してください。)
...または数値法の権威であるHigham 。ラズベリーの茂みの中を歩くのと同じように、数学を解析するのはちょっと難しいことを除いて。:/
または、Octave ソースでMATLAB のrcond()
バージョンを確認してください。この投稿を見つけました。
正方行列の場合、その行列式を確認できます--- Matrix.det()は、行列が特異である場合にのみゼロを返します。もちろん、条件の悪い行列にも注意する必要があります。