2010-02-12 17 views
13

मैं अजगर या scipy का उपयोग कर अजगर में एक गैर स्क्वायर मैट्रिक्स के बाएं उलटा प्राप्त करने की कोशिश कर रहा हूँ। मैं निम्नलिखित मैटलैब कोड को पायथन में कैसे अनुवाद कर सकता हूं?numpy या 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 

वहाँ एक numpy या Matlab में बाईं उलटा \ ऑपरेटर की scipy बराबर है?

+0

आप इस लिंक मिल सकती है उपयोगी: http://mathesaurus.sourceforge.net/ matlab-numpy.html मुझे यकीन नहीं है कि यह एक होगा हालांकि इस विशिष्ट सवाल nswer। – SapphireSun

उत्तर

9

का उपयोग करें A वर्ग नहीं है। विवरण के लिए here देखें। का उपयोग कर सकते हैं यदि A वर्ग है, लेकिन आपके मामले में नहीं।

+0

मैं scipy.sparse मॉड्यूल का उपयोग कर रहा हूं, और ए एक स्पैर मैट्रिक्स है। क्या linalg.lstsq (ए, वाई) काम करता है अगर ए स्पैस है? – dzhelil

+0

ठीक है आप 'scipy.linalg.lstsq (A.todense(), y.todense()) कर सकते हैं, लेकिन यह गति या स्मृति के कारण एक विकल्प नहीं हो सकता है। स्पैस मैट्रिस पर सीधे 'lstsq' के बारे में निश्चित नहीं है। यह धागा ब्याज का हो सकता है: http://mail.scipy.org/pipermail/scipy-user/2008-November/018793.html – Ramashalanka

0

मैं इसे परीक्षण नहीं किया है, लेकिन this web page के अनुसार यह है:

linalg.solve(A,y) 
+2

यही वह था जो मैं सोच रहा था, लेकिन '' 'matlab में केवल यह है कि अगर ए एक है वर्ग मैट्रिक्स। उस स्थिति में, आपको lalg.lstsq का उपयोग रामशलंक के रूप में करना चाहिए। –

2

तुम भी numpy/scipy में छद्म उलटा समारोह pinv के बराबर के लिए देख सकते हैं, अन्य उत्तर के लिए एक विकल्प के रूप में है कि है।

2

यहाँ एक विधि है कि विरल मैट्रिक्स के साथ काम करेंगे (जो अपनी टिप्पणी से है कि आप क्या चाहते) का अनुकूलन पैकेज से leastsq फ़ंक्शन का उपयोग करता है जो

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] 

उत्पन्न

[ 1. 2.] 

यह है किस तरह से leastsq चाहता था के अनुसार मिलान करने के लिए आकार कैसे प्राप्त करना था के बदसूरत बदसूरत। शायद कोई और जानता है कि इसे थोड़ा और साफ कैसे बनाया जाए।

मैंने लाइनरऑपरेटर्स का उपयोग करके scipy.sparse.linalg में कार्यों के साथ कुछ काम करने की कोशिश की है, लेकिन इसका कोई फायदा नहीं हुआ है। समस्या यह है कि उन सभी कार्यों को केवल वर्ग कार्यों को संभालने के लिए बनाया जाता है। अगर किसी को ऐसा करने का कोई तरीका मिल जाए, तो मैं भी जानना चाहूंगा।

2

जो बड़े विरल कम से कम वर्गों की समस्याओं को हल करना चाहते हैं उन लोगों के लिए:

मैं SciPy को LSQR एल्गोरिथ्म जोड़ लिया है। अगली फिल्म के साथ, आप ऐसा करने में सक्षम हो जाएगा:

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) 

जो जवाब [1, 2] देता है।

आप SciPy उन्नयन के बिना इस नई कार्यक्षमता का उपयोग करना चाहते हैं, तो आप

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

0

आप विरल मैट्रिक्स को हल करने के scipy.sparse.linalg से lsqr उपयोग कर सकते हैं पर कोड रिपोजिटरी से lsqr.py डाउनलोड कर सकते हैं कम से कम वर्गों

0

साथ सिस्टम आप मैट्रिक्स गणनाओं का उपयोग छोड़ दिया उलटा गणना कर सकते हैं:

import numpy as np 

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

(क्यों?क्योंकि:

enter image description here

)

टेस्ट:

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)) 

परिणाम:

A 
[[-1.086 0.997] 
[ 0.283 -1.506] 
[-0.579 1.651]] 
A_linv.dot(A) 
[[ 1. -0.] 
[ 0. 1.]] 
संबंधित मुद्दे