Эффективная и pythonic проверка для сингулярной матрицы

Здесь мы работаем над некоторой матричной алгеброй. Иногда мне нужно инвертировать матрицу, которая может быть сингулярной или плохо обусловленной. Я понимаю, что это просто pythonic:

try: i = linalg.inv(x) except LinAlgErr as err: #handle it 

но я не уверен, насколько это эффективно. Разве это не было бы лучше?

 if linalg.cond(x) < 1/sys.float_info.epsilon: i = linalg.inv(x) else: #handle it 

Действительно ли numpy.linalg просто выполняет тест, который я запретил?

  • Существует ли эквивалент Python для команды «which»
  • Что такое пример кода для демонстрации многоядерного ускорения в Python в Windows?
  • Django: развертывание приложения на Heroku с sqlite3 в качестве базы данных
  • Регистрация Python перед запуском logging.basicConfig?
  • Как заблокировать SSL-протоколы в пользу TLS?
  • Масштабировать изображения с сохранением прозрачности и цвета PIL?
  • Ошибка 111, подключаемая к localhost: 6379. В соединении отказано. Django Heroku
  • График цветного куба в matplotlib
  • 4 Solutions collect form web for “Эффективная и pythonic проверка для сингулярной матрицы”

    Ваше первое решение ловит случай, когда ваша матрица настолько необычна, что numpy не справляется вообще – потенциально весьма экстремальный случай. Второе решение лучше, потому что оно улавливает случай, когда numpy дает ответ, но этот ответ потенциально поврежден ошибкой округления – это кажется гораздо более разумным.

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

    Если вы не хотите SVD, посмотрите также мои комментарии об использовании lu_factor вместо inv.

    Поэтому на основе входных данных здесь я отмечаю свой исходный код с явным тестом в качестве решения:

     if linalg.cond(x) < 1/sys.float_info.epsilon: i = linalg.inv(x) else: #handle it 

    Удивительно, но функция numpy.linalg.inv не выполняет этот тест. Я проверил код и обнаружил, что он проходит через все его махинации, а затем просто вызывает рутинную процедуру – кажется довольно неэффективным. Кроме того, я бы сделал 2-ой пункт, сделанный DaveP: что обратная матрица не должна вычисляться, если она явно не нужна.

    Вы должны вычислить номер условия матрицы, чтобы убедиться, что она обратима.

     import numpy.linalg if numpy.isfinite(numpy.linalg.cond(A)): B = numpy.linalg.inv(A) else: # handle it 

    Почему бы просто не проверить, отличен ли детерминант?

     det = numpy.linalg.det(A) if det != 0: #proceed 
    Python - лучший язык программирования в мире.