2012-02-06 40 views
13

Trong NumPy, tôi đang cố gắng sử dụng linalg để tính toán nghịch đảo ma trận ở mỗi bước của một chương trình Newton-Raphson (kích thước vấn đề là nhỏ cố ý để chúng tôi có thể đảo ngược ma trận Hessian được tính toán phân tích). Tuy nhiên, sau khi tôi tiến xa về phía sự hội tụ, Hessian trở nên gần kỳ dị.Làm thế nào để thử, ngoại trừ một hoạt động ma trận bất hợp pháp do số ít trong NumPy

Có phương pháp nào trong NumPy cho phép tôi kiểm tra xem liệu ma trận có được coi là số ít hay không (yếu tố tính toán không đủ mạnh)? Lý tưởng nhất, nó sẽ là tốt đẹp nếu có một cách để sử dụng một khối tryexcept để bắt lỗi mảng đơn số của NumPy.

Tôi làm như thế nào? Các lỗi NumPy trao tại nhà ga là:

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

Trả lời

24

Cú pháp sẽ là như thế này:

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

Cảm ơn. Đó là một trong những khoảnh khắc "dăm" đầu tát; Tôi đã không nhận ra chúng tôi có thể trực tiếp sử dụng các lỗi NumPy trong một tuyên bố 'trừ'. – ely

+0

Ngoài ra, có cách nào để làm điều này cụ thể cho 'ma trận Singular' và không chỉ bất kỳ trường hợp của LinAlgError? – ely

+1

Vâng, bạn có thể tăng lại ngoại lệ bị bắt nếu đó không phải là thông báo đó .. xem chỉnh sửa mới nhất cho câu trả lời của tôi. Đây là một cách để làm điều đó, tôi không chắc chắn nếu có một cách tốt hơn. – wim

3

wim 's câu trả lời không còn hoạt động cho các phiên bản hiện tại của NumPy (Tôi đang sử dụng 1,13 tại thời gian viết). Thay vào đó, hãy thực hiện:

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 
Các vấn đề liên quan