如果您要求推荐一个库,这在 Stack Overflow 中显然是题外话。但是下面我提到了一些常用的算法;这可以帮助你找到或写下你需要的东西。不过,我不建议您编写任何东西,除非您真的想这样做,因为要正确使用这些算法可能会很棘手。如果你决定写点东西,我推荐 QR 方法,因为它最容易写,虽然理论有点微妙。
首先你真的需要计算逆吗?例如,如果您需要做的是计算
x = inv(J)*y
那么将这个问题处理为更快更准确
solve J*x = y for x
下面的所有方法都将 J 分解为其他矩阵,对此可以完成此解决方案。实现分解的好包也将具有执行解决方案的代码。
如果你真的真的需要逆运算,最好的方法是求解,一次一列
J*K = I for K, where I is the identity matrix
LU分解
这可能是此处描述的算法中最快的,但也是最不准确的。重要的一点是该算法必须包括(部分)旋转,否则它将不适用于所有可逆矩阵,例如它将在旋转 90 度时失败。
你得到的是 J 的因式分解:
J = P*L*U
where P is a permutation matrix,
L lower triangular,
U upper triangular
因此,分解后,为了求解 x,我们需要执行三个步骤,每个步骤都很简单,并且每个步骤都可以就地完成(即所有 x 可以是同一个变量)
Solve P*x1 = y for x1
Solve L*x2 = x1 for x2
Solve U*x = x2 for x
二维码分解
这可能比 LU 慢一些,但更准确。从概念上讲,这将 J 分解为
J = Q*R
其中 Q 是正交的,R 是上三角的。然而,正如通常实现的那样,您实际上将 y 和 J 传递给例程,它返回 R(在 J 中)和 Q'*y(在传递的 y 中),所以要求解 x,您只需要求解
R*x = y
鉴于 R 是上三角形,这很容易。
SVD(奇异值分解)
这是最准确的,但也是最慢的。此外,与其他人不同的是,即使 J 是奇异的,您也可以取得进展(您可以计算应用于 y 的“广义逆”)。
我建议阅读此内容,但建议不要自己实施。
简而言之,你将 J 分解为
J = U*S*V'
其中 U 和 V 是正交的,S 是对角线的。
当然,还有许多其他方法可以解决这个问题。例如,如果您的矩阵非常大(以数千为单位),那么使用迭代方法可能会更快,特别是如果它们是稀疏的(很多零)。