2016-11-21 7 views
1

MatlabコードをPythonコードに変換しようとしています。MatlabからPythonへ:SVDを使用したシステムの解決

私は

Aが2次元配列 (2257x456)、どこ bは、1次元配列 (2257x1)である
x = A\b; 

で立ち往生しています。

Matlabのxにoutputed配列は1次元配列(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の演算の背後にある数学は分かりません。出力配列( 'x')は同じです。 – TomazStoiljkovic

答えて

4

あなたはnp.linalg.lstsq(A,b)をしたいです。もう一度、docstringを見て、と4つのという値を返すことに注意してください。だから、それを使用するには、「成功しません...。」

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

それとも、あなたはx以外のすべてを無視したい場合は、

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

ありがとうございますが、その結果はMatlabと同じではありません。私は 'x'はlstsq()関数でMatlabと同じ計算されていないと思いますか? PythonとMatlabではAとbが同じであることに注意してください – TomazStoiljkovic

関連する問題