2016-11-21 83 views
1

我想將Matlab代碼轉換爲Python代碼。Matlab to Python:使用SVD解決系統

我堅持

x = A\b; 

其中A是2D陣列(2257x456)並且其中b是一維數組(2257x1)

在Matlab x outputed該數組是一維數組(456x1)

也有是在Matlab代碼,說評論:%Solve the system using SVD

所以我怎麼能在Python這樣做呢?

我嘗試使用下面的代碼,但沒有成功。

x = np.linalg.lstsq(A,b) 
x = np.linalg.lstsq(A.T, b.T)[1].T 
x = A :\\ b # found this [here][1] 
x = np.linalg.solve(A,b) 


[1]: https://docs.scipy.org/doc/numpy-dev/user/numpy-for-matlab-users.html 

更新:

錯誤和結果產生:

x = np.linalg.solve(A,b) : LinAlgError: Last 2 dimensions of the array must be square 

x = np.linalg.lstsq(A,b) : x is not expected result, it is 3D array (4x456x1) 

x = np.linalg.lstsq(A.T, b.T)[1].T : LinAlgError: Incompatible dimensions 
+0

*「......沒有成功。」 *解釋你遇到的問題。你有錯誤嗎?如果是這樣,請顯示錯誤消息。你有沒有得到你沒有想到的結果?如果是這樣,展示你得到的並解釋你的期望。 (使用更小的數組測試代碼可能更簡單,例如A可能是10x5和b 10x1。) –

+0

更新後的問題,我不太瞭解Matlab中操作背後的數學,所以我只是嘗試使用代碼並檢查if輸出數組('x')是相同的。 – TomazStoiljkovic

回答

4

你想np.linalg.lstsq(A,b)。再看看docstring,並注意它返回四個的值。因此,要使用它,你會寫

x, residuals, rank, s = np.linalg.lstsq(A,b) 

或者,如果你想不顧一切,除了x

x = np.linalg.lstsq(A,b)[0] 
+0

謝謝你的解釋,但結果與Matlab不一樣。我猜'x'的計算與使用lstsq()函數的Matlab不同。請注意,A和b在Python和Matlab中是相同的 – TomazStoiljkovic