2012-02-06 4 views
13

En NumPy, estoy tratando de usar linalg para calcular inversos de matriz en cada paso de un esquema de Newton-Raphson (el tamaño del problema es pequeño intencionalmente para que podamos puede invertir matrices de Hessian calculadas analíticamente). Sin embargo, después de llegar lejos hacia la convergencia, el Hessian se acerca al singular.Cómo probar, excepto una operación de matriz ilegal debido a la singularidad en NumPy

¿Hay algún método dentro de NumPy que me permita probar si una matriz se considera singular (el determinante informático no es lo suficientemente robusto)? Idealmente, sería bueno si hay una manera de utilizar un bloque tryexcept para capturar el error de matriz singular de NumPy.

¿Cómo voy a hacer esto? El error NumPy dada en la terminal es:

raise LinAlgError, 'Singular matrix' 
numpy.linalg.linalg.LinAlgError: Singular matrix 

Respuesta

24

La sintaxis sería así:

import numpy 

try: 
    # your code that will (maybe) throw 
except numpy.linalg.linalg.LinAlgError as err: 
    if 'Singular matrix' in err.message: 
     # your error handling block 
    else: 
     raise 
+0

Gracias. Es uno de esos momentos "d'oh" que golpean la cabeza; No me di cuenta de que podíamos usar directamente los errores NumPy en una declaración 'except'. – ely

+0

Además, ¿hay alguna forma de hacerlo específico a 'Singular matrix' y no a cualquier instancia de LinAlgError? – ely

+1

Bueno, puede volver a subir la excepción atrapada si no es ese mensaje ... vea la última edición de mi respuesta. Esta es una forma de hacerlo, no estoy seguro de si hay una mejor manera. – wim

3

wim 's respuesta ya no funciona para las versiones actuales de NumPy (estoy usando 1,13 en el tiempo de escritura). En su lugar, haga:

import numpy as np 

try: 
    # your code that will (maybe) throw 
except np.linalg.LinAlgError as e: 
    if 'Singular matrix' in str(e): 
     # your error handling block 
    else: 
     raise 
Cuestiones relacionadas