3

我正在尝试将 IDL 程序翻译成 Python。我必须通过SVD以下方式解决我所取得的结果

from scipy.linalg import svd
A = [[1,2,3],[4,5,6]]
b = [4,4,5]

u,w,v = svd(A)

这很好用,并且很好地从 IDL 翻译。下一步是在 IDL(!)

x = svsol(u,w,v,b)

uin python 和 IDL 几乎相同(对于其他矩阵也是如此)。唯一的区别是维度,IDL 的矩阵更大,但有很多零。从这个意义上说,Python 的矩阵看起来更加压缩。

有谁知道 Python 类似的东西。

如果有人需要,这里是svsol.

4

1 回答 1

4

使用SVDCSVSOL在 IDL 中,您可以通过 SVD 分解解决线性最小二乘问题。这是numpynumpy.linalg.lstsq函数完成的。(无需先计算 SVD 分解然后反解。)

>>> import numpy as np
>>> A = np.array([[1,2,3],[4,5,6]])
>>> b = np.array([4,4])
>>> x, _, _, _ = np.linalg.lstsq(A,b)
>>> x
array([-2.,  0.,  2.])
>>> np.dot(A,x)
array([ 4.,  4.])

请注意, 的长度b必须与 的行数相同A,因此您的示例是错误的。只是为了确保我正确解释了 IDL 语义,以下是svsol 参考手册中的示例:

>>> A = np.array(
... [[1.0, 2.0, -1.0, 2.5],
...  [1.5, 3.3, -0.5, 2.0],
...  [3.1, 0.7,  2.2, 0.0],
...  [0.0, 0.3, -2.0, 5.3],
...  [2.1, 1.0,  4.3, 2.2],
...  [0.0, 5.5,  3.8, 0.2]])
>>> B = np.array([0.0, 1.0, 5.3, -2.0, 6.3, 3.8])
>>> x, _, _, _ = np.linalg.lstsq(A,B)
>>> print x
[ 1.00095058  0.00881193  0.98417587 -0.01009547]
于 2012-10-04T21:21:46.430 回答