Исключение в потоке "main" java.lang.RuntimeException: матрица единственного числа - PullRequest
2 голосов
/ 09 июня 2011

Я просто пытаюсь создать обратную матрицу матрицы 3х3, следуя документации JAMA. Но каждый раз это выдает мне следующую ошибку -

Exception in thread "main" java.lang.RuntimeException: Matrix is singular

Может ли кто-нибудь помочь мне в этом отношении?

Ответы [ 3 ]

2 голосов
/ 09 июня 2011

Документация для Джама не очень хорошая.

Фактически, если вы посмотрите исходный код, вы обнаружите, что 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         }

Как гласит Википедия:

"В линейной алгебре n-на-n (квадратная) матрица A называется обратимой, невырожденной или невырожденной, если существует n-на-n матрица B такая, что AB = BA = I п где I n обозначает единичную матрицу n-на-n, а используемое умножение - обычное умножение матриц. "

Короче говоря, единственное число означает необратимый.


Если вы недовольны JAMA, взгляните на библиотеки Apache Commons Maths, в частности модуль Linear Algebra .

1 голос
/ 09 июня 2011

Ну, это говорит вам все, что вам нужно знать: матрица, которую вы пытаетесь инвертировать, является единственной.

Матрицы в единственном числе необратимы.

Если вы считаете, что ваша матрица не 'Пожалуйста, опубликуйте его, и мы посмотрим.

1 голос
/ 09 июня 2011

Если вы сможете вычислить определитель вашей матрицы, вы обнаружите, что она равна нулю (или близка к ней).

Возможно, вы сможете узнать по результатам осмотра.Если один ряд пропорционален другому, ваша матрица не обратима.

3x3 достаточно легко инвертировать вручную.Попробуйте и посмотрите, где это не так.

Попробуйте решение SVD.Он скажет вам, что такое пустое пространство для вашей матрицы.

...