2008-10-17 85 views
55

Làm thế nào để tôi có được nghịch đảo của ma trận trong python? Tôi đã thực hiện nó bản thân mình, nhưng nó là tinh khiết python, và tôi nghi ngờ có các mô-đun nhanh hơn ra khỏi đó để làm điều đó.Đảo ngược Python của ma trận

+0

bạn có thể vui lòng cho thuật toán của bạn? –

+0

có câu trả lời ở đây, nếu ai đó muốn một đoạn mã https://stackoverflow.com/questions/32114054/matrix-inversion-without-numpy – Alex

Trả lời

99

Bạn nên xem numpy nếu bạn thực hiện thao tác ma trận. Đây là một mô-đun chủ yếu được viết bằng C, sẽ nhanh hơn nhiều so với lập trình trong python thuần túy. Đây là một ví dụ về cách đảo ngược ma trận và thực hiện các thao tác ma trận khác.

from numpy import matrix 
from numpy import linalg 
A = matrix([[1,2,3],[11,12,13],[21,22,23]]) # Creates a matrix. 
x = matrix([[1],[2],[3]])     # Creates a matrix (like a column vector). 
y = matrix([[1,2,3]])      # Creates a matrix (like a row vector). 
print A.T         # Transpose of A. 
print A*x         # Matrix multiplication of A and x. 
print A.I         # Inverse of A. 
print linalg.solve(A, x)  # Solve the linear equation system. 

Bạn cũng có thể có một cái nhìn tại các module array, mà là một thực hiện hiệu quả hơn nhiều các danh sách khi bạn phải đối phó với chỉ có một kiểu dữ liệu.

+0

numpy cũng được nêu trong cuốn sách "Mã đẹp". :-) – Deestan

+3

Lưu ý ở đây cũng có, không có đảo ngược xảy ra, và rằng hệ thống được giải quyết trực tiếp, theo câu trả lời của John D. Cook. –

+0

Cân nhắc sử dụng các mảng thay vì ma trận] (https://docs.scipy.org/doc/numpy-dev/user/numpy-for-matlab-users.html#array-or-matrix-which-should-i -sử dụng). Cùng với ['numpy.linalg'] (https://docs.scipy.org/doc/numpy/reference/routines.linalg.html), bạn có thể nhận được khá nhiều thứ bạn muốn, không sử dụng' numpy.matrix khó sử dụng '. – Praveen

1

Nếu bạn ghét khó chịu, hãy lấy RPy và bản sao R của bạn và sử dụng nó thay thế.

(Tôi cũng sẽ lặp lại để làm cho bạn thực sự cần đảo ngược ma trận. Trong R, ví dụ, linalg.solve và hàm resolve() không thực sự làm đảo ngược hoàn toàn, vì nó không cần thiết.)

+3

Không bao giờ được sử dụng R, nhưng tại sao một chương trình bên ngoài và chất kết dính python của nó lại tốt hơn gói khoa học nổi tiếng nhất của python? –

52

Đảm bảo bạn thực sự cần đảo ngược ma trận. Điều này thường không cần thiết và có thể không ổn định về số lượng. Khi hầu hết mọi người hỏi làm thế nào để đảo ngược một ma trận, họ thực sự muốn biết làm thế nào để giải quyết Ax = b trong đó A là một ma trận và x và b là vectơ. Hiệu quả hơn và chính xác hơn khi sử dụng mã giải phương trình Ax = b cho x trực tiếp hơn để tính A nghịch đảo sau đó nhân nghịch đảo với B. Ngay cả khi bạn cần giải quyết Ax = b cho nhiều giá trị b, nó không phải là ý hay để đảo ngược A. Nếu bạn phải giải hệ thống cho nhiều giá trị b, hãy lưu hệ số Cholesky của A, nhưng không đảo ngược nó.

Xem Don't invert that matrix.

+0

Nếu các thành viên ma trận của tôi là hợp lý chính xác thì sao? Dường như điều đó tránh được vấn đề về độ chính xác, mặc dù tất nhiên với chi phí làm cho vấn đề hiệu năng trở nên tồi tệ hơn rất nhiều. –

6

Bạn có thể tính toán các yếu tố quyết định của ma trận đó là đệ quy và sau đó hình thành ma trận tiếp giáp

Here is a short tutorial

Tôi nghĩ rằng đây chỉ làm việc cho ma trận vuông

Một cách khác để tính toán những liên quan đến gram -ghmidt trực giao và sau đó transposing ma trận, transpose của một ma trận trực giao là nghịch đảo của nó!

10

Đó là một điều đáng tiếc rằng ma trận lựa chọn, lặp đi lặp lại ở đây một lần nữa, là một trong hai số ít hoặc nặng lạnh:

A = matrix([[1,2,3],[11,12,13],[21,22,23]]) 

Theo định nghĩa, nghịch đảo của A khi nhân với ma trận A chính nó phải đưa ra một ma trận đơn vị . Người được chọn trong lời giải thích được ca ngợi nhiều không làm điều đó. Trong thực tế chỉ cần nhìn vào nghịch đảo cho một đầu mối rằng đảo ngược không hoạt động chính xác. Nhìn vào tầm quan trọng của các thuật ngữ cá nhân - chúng rất, rất lớn so với các điều khoản của ma trận A gốc ...

Điều đáng chú ý là con người khi chọn một ví dụ về ma trận thường quản lý để chọn ma trận số ít!

Tôi đã gặp sự cố với giải pháp, vì vậy hãy xem xét kỹ hơn. Trên nền tảng ubuntu-kubuntu, gói debian numpy không có ma trận và các gói con linalg, do đó, ngoài việc nhập khẩu gọn gàng, scipy cũng cần được nhập khẩu.

Nếu thuật ngữ đường chéo của A được nhân với hệ số đủ lớn, giả sử 2, ma trận rất có thể sẽ không còn là số ít hoặc gần số ít.Vì vậy,

A = matrix([[2,2,3],[11,24,13],[21,22,46]]) 

không trở thành số ít hoặc gần như số ít và ví dụ cho kết quả có ý nghĩa ... Khi xử lý số nổi, người ta phải theo dõi tác động của lỗi không thể tránh khỏi.

Cảm ơn sự đóng góp của bạn,

OldAl.

+0

người ta cũng có thể kiểm tra A == AII để xác minh kết quả – georg

+1

Vấn đề là con người chọn ma trận ở "ngẫu nhiên" bằng cách nhập số học đơn giản trong các hàng, như 1, 2, 3 hoặc 11, 12, 13. vấn đề là nếu bạn có ít nhất ba hàng như thế này thì chúng luôn phụ thuộc tuyến tính. – asmeurer

5

NumPy sẽ phù hợp với hầu hết mọi người, nhưng bạn cũng có thể làm matrices in Sympy

Hãy thử chạy các lệnh này tại http://live.sympy.org/

M = Matrix([[1, 3], [-2, 3]]) 
M 
M**-1 

Đối với niềm vui, hãy thử M**(1/2)

+1

Tôi thấy rằng 'numpy.linalg' đã cho kết quả không chính xác cho ma trận có chứa số nguyên lớn, trong khi kết quả từ' sympy' là chính xác. +1 – primo

+0

Với độ chính xác gần đúng, Sympy là thiết bị đầu cuối tốt và sống. Tôi đã kiểm tra với lệnh '(M ** - 1) * M' và nó cho ma trận đơn vị (không chính xác nhưng rất gần) –

Các vấn đề liên quan