Тест на обратимость с использованием Jama.Matrix - PullRequest
2 голосов
/ 27 января 2009

У меня есть программа, которая использует JAMA , и мне нужно проверить, можно ли перевернуть матрицу. Я знаю, что могу просто попробовать и поймать исключение, но это кажется плохой идеей (иметь блок catch в качестве части «нормального» пути кода, похоже, плохая форма).

Предпочтителен тест, который также возвращает обратное значение (или выполняется с лучшим значением O (), чем обратное действие).

Ответы [ 4 ]

2 голосов
/ 27 января 2009

В общем, если вы не можете решить матрицу, она однослойная (необратимая). Я полагаю, что способ, которым JAMA делает это, состоит в том, чтобы попытаться решить матрицу, используя факторизацию LU, и в случае неудачи возвращает «true» для isSingular ().

На самом деле не существует общего способа просто посмотреть на элементы матрицы и определить, является ли она единственной - вам нужно проверить каждый столбец, чтобы убедиться, что он ортогонален другим (т. Е. Пустое пространство для матрицы 0). Факторизация LU довольно быстрая, обычно ... однако бывают случаи, когда она занимает большую часть операции.

Есть ли у вас реальная проблема со скоростью, которую вы пытаетесь преодолеть?

0 голосов
/ 27 января 2009

звучит так, как будто вы хотите оценить обратную величину номера условия.

Этот сайт выглядит несколько перспективно ...

См. Также Голуб и Ван Лоан, с. 128-130 . (Если у вас нет его копии, получите его.)

... или Higham , который является специалистом по численным методам. За исключением того, что довольно сложно разобрать математику ... как пройти через чащу малиновых кустов. : /

Или, возможно, проверьте источники Octave на наличие версии MATLAB rcond(). Я нашел этот пост .

0 голосов
/ 27 января 2009

Если выдается исключение, какова ваша позиция восстановления?

Если вы выполняете декомпозицию LU и обнаруживаете, что она является единственной, поймаете ли вы исключение и вместо этого попробуете SVD (декомпозицию по сингулярному значению)?

0 голосов
/ 27 января 2009

Для квадратной матрицы вы можете просто проверить ее определитель --- Matrix.det () возвращает ноль тогда и только тогда, когда матрица является единственной. Конечно, вам также нужно следить за плохо обусловленными матрицами.

...