JAMAのドキュメントに従って、3x3行列の逆行列を作成しようとしています。しかし、それが私に次のエラーを与えるたびに-
Exception in thread "main" java.lang.RuntimeException: Matrix is singular
誰かがこの点で私を助けることができますか?
Jamaのドキュメントはあまり良くありません。
実際、ソースコードを調べると、Matrix.inverse()最終的には呼び出しが行わLUDecomposition.solve(...)れ、コードには次のように書かれていることがわかります。
270 /** Solve A*X = B
271 @param B A Matrix with as many rows as A and any number of columns.
272 @return X so that L*U*X = B(piv,:)
273 @exception IllegalArgumentException Matrix row dimensions must agree.
274 @exception RuntimeException Matrix is singular.
275 */
277 public Matrix solve (Matrix B) {
278 if (B.getRowDimension() != m) {
279 throw new IllegalArgumentException("Matrix row dimensions must agree.");
280 }
281 if (!this.isNonsingular()) {
282 throw new RuntimeException("Matrix is singular.");
283 }
ウィキペディアが言うように:
「線形代数では、AB = BA = Inであるようなn行n列の行列Bが存在する場合、n行n列(正方形)の行列Aは、可逆または非特異または非縮退と呼ばれます。ここで、Inはn行 を示します。 -n正則行列と使用される乗算は、通常の行列乗算です。」
要するに、単数は可逆ではないことを意味します。
JAMAに不満がある場合は、Apache Commons Mathsライブラリ、特に線形代数モジュールを確認してください。
行列式を計算できる場合は、それがゼロ(またはそれに近い)であることがわかります。
検査でわかるかもしれません。ある行が別の行に比例している場合、行列は可逆ではありません。
3x3は、手で反転するのに十分簡単です。それを試して、どこがうまくいかないかを確認してください。
SVDソリューションを試してください。行列のヌルスペースが何であるかがわかります。
まあ、それはあなたが知る必要があるすべてをあなたに伝えています:あなたが反転しようとしているマトリックスは特異です。
特異行列は可逆です。
マトリックスが特異ではないと思われる場合は、投稿してください。確認します。