【问题标题】:Matlab to Python: Solving the system using SVDMatlab 到 Python:使用 SVD 求解系统
【发布时间】:2016-11-22 01:05:31
【问题描述】:

我正在尝试将 Matlab 代码转换为 Python 代码。

我被困住了

x = A\b;

其中A 是二维数组(2257x456),其中b 是一维数组(2257x1)

Matlab中输出的数组x是一维数组(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

【问题讨论】:

  • "...没有成功。"解释你遇到的问题。你收到错误了吗?如果是这样,请显示错误消息。你有没有得到你没想到的结果?如果是这样,请展示您得到的结果并解释您的期望。 (使用较小的数组测试代码可能更简单,例如 A 可能是 10x5,b 可能是 10x1。)
  • 更新问题,我不太了解 Matlab 中运算背后的数学原理,所以我只是在尝试代码并检查输出数组 ('x') 是否相同。

标签: python matlab numpy svd


【解决方案1】:

你想要np.linalg.lstsq(A,b)。再看看docstring,注意它返回四个 值。所以要使用它,你会写

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

或者,如果您想忽略除x 之外的所有内容,

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

【讨论】:

  • 谢谢解释,但是结果和Matlab中的不一样。我猜 'x' 的计算方式与使用 lstsq() 函数的 Matlab 中的计算方式不同?注意 A 和 b 在 Python 和 Matlab 中是相同的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多