2010-02-12 45 views
13

Tôi đang cố gắng để có được nghịch đảo trái của một ma trận không vuông trong python sử dụng một trong hai numpy hoặc scipy. Làm cách nào để dịch mã Matlab sau sang Python?Nghịch đảo trái trong numpy hoặc scipy?

>> A = [0,1; 0,1; 1,0] 

A = 

    0  1 
    0  1 
    1  0 

>> y = [2;2;1] 

y = 

    2 
    2 
    1 

>> A\y 

ans = 

    1.0000 
    2.0000 

Có sự tương đương vón cục hoặc scipy của toán tử trái ngược \ trong Matlab không?

+0

Bạn có thể thấy liên kết này hữu ích: http://mathesaurus.sourceforge.net/ matlab-numpy.html Tôi không chắc liệu nó có nswer câu hỏi cụ thể này mặc dù. – SapphireSun

Trả lời

9

Sử dụng linalg.lstsq(A,y) từ A không vuông. Xem here để biết chi tiết. Bạn có thể sử dụng linalg.solve(A,y) nếu A là hình vuông, nhưng không phải trong trường hợp của bạn.

+0

Tôi đang sử dụng mô-đun scipy.sparse và A là ma trận thưa thớt. Có linalg.lstsq (A, y) làm việc nếu A là thưa thớt? – dzhelil

+0

Bạn có thể làm 'scipy.linalg.lstsq (A.todense(), y.todense())', nhưng đó có thể không phải là một tùy chọn do tốc độ hoặc bộ nhớ. Không chắc chắn về 'lstsq' trực tiếp trên các ma trận thưa thớt. Chủ đề này có thể được quan tâm: http://mail.scipy.org/pipermail/scipy-user/2008-November/018793.html – Ramashalanka

0

tôi đã không kiểm tra nó, nhưng theo this web page nó là:

linalg.solve(A,y) 
+2

Đó là những gì tôi đã suy nghĩ, nhưng '\' trong MATLAB chỉ làm điều đó nếu A là một Ma trận vuông. Trong trường hợp đó, bạn phải sử dụng linalg.lstsq như Ramashalanka nói. –

2

Bạn cũng có thể tìm kiếm tương đương với chức năng giả nghịch đảo pinv trong numpy/scipy, như là một thay thế cho câu trả lời khác Là.

2

Đây là một phương pháp mà sẽ làm việc với ma trận thưa thớt (mà từ ý kiến ​​của bạn là những gì bạn muốn) trong đó sử dụng các chức năng leastsq từ gói tối ưu hóa

from numpy import * 
from scipy.sparse import csr_matrix 
from scipy.optimize import leastsq 
from numpy.random import rand 

A=csr_matrix([[0.,1.],[0.,1.],[1.,0.]]) 
b=array([[2.],[2.],[1.]]) 

def myfunc(x): 
    x.shape = (2,1) 
    return (A*x - b)[:,0] 

print leastsq(myfunc,rand(2))[0] 

tạo

[ 1. 2.] 

Đó là loại xấu xí bởi vì làm thế nào tôi đã có để có được những hình dạng để phù hợp theo những gì ít nhất là muốn. Có thể ai đó khác biết cách làm cho nó gọn gàng hơn một chút.

Tôi cũng đã cố gắng để có được một cái gì đó để làm việc với các chức năng trong scipy.sparse.linalg bằng cách sử dụng LinearOperators, nhưng vô ích. Vấn đề là tất cả các chức năng đó chỉ được thực hiện để xử lý các hàm vuông. Nếu bất cứ ai tìm cách làm theo cách đó, tôi cũng muốn biết.

2

Đối với những người muốn giải quyết vấn đề thưa thớt bình phương nhỏ nhất lớn:

Tôi đã thêm các thuật toán LSQR để scipy. Với bản phát hành tiếp theo, bạn sẽ có thể thực hiện:

from scipy.sparse import csr_matrix 
from scipy.sparse.linalg import lsqr 
import numpy as np 

A = csr_matrix([[0., 1], [0, 1], [1, 0]]) 
b = np.array([[2.], [2.], [1.]]) 

lsqr(A, b) 

trả về câu trả lời [1, 2].

Nếu bạn muốn sử dụng tính năng mới này mà không cần nâng cấp scipy, bạn có thể tải về lsqr.py từ kho lưu trữ mã tại

http://projects.scipy.org/scipy/browser/trunk/scipy/sparse/linalg/isolve/lsqr.py

0

Bạn có thể sử dụng lsqr từ scipy.sparse.linalg để giải quyết ma trận thưa thớt hệ thống với bình phương nhỏ nhất

0

Bạn có thể tính ngược lại sử dụng tính toán ma trận:

import numpy as np 

linv_A = np.linalg.solve(A.T.dot(A), A.T) 

(Tại sao?Bởi vì:

enter image description here

)

Test:

np.set_printoptions(suppress=True, precision=3) 
np.random.seed(123) 

A = np.random.randn(3, 2) 
print('A\n', A) 

A_linv = np.linalg.solve(A.T.dot(A), A.T) 
print('A_linv.dot(A)\n', A_linv.dot(A)) 

Kết quả:

A 
[[-1.086 0.997] 
[ 0.283 -1.506] 
[-0.579 1.651]] 
A_linv.dot(A) 
[[ 1. -0.] 
[ 0. 1.]] 
Các vấn đề liên quan