使用 'np.linalg.solve()' 计算 'AB⁻¹'



我需要在Python/Numpy中计算两个矩阵ABAB⁻¹(当然,B是平方的(。

我知道np.linalg.inv()可以让我计算B⁻¹,然后我可以乘以A。 我也知道B⁻¹A实际上用np.linalg.solve()计算得更好。

受此启发,我决定在np.linalg.solve()方面重写AB⁻¹。 我得到了一个公式,基于恒等(AB)ᵀ = BᵀAᵀ,它使用np.linalg.solve().transpose()

np.linalg.solve(a.transpose(), b.transpose()).transpose()

这似乎正在完成这项工作:

import numpy as np

n, m = 4, 2
np.random.seed(0)
a = np.random.random((n, n))
b = np.random.random((m, n))
print(np.matmul(b, np.linalg.inv(a)))
# [[ 2.87169378 -0.04207382 -1.10553758 -0.83200471]
#  [-1.08733434  1.00110176  0.79683577  0.67487591]]
print(np.linalg.solve(a.transpose(), b.transpose()).transpose())
# [[ 2.87169378 -0.04207382 -1.10553758 -0.83200471]
#  [-1.08733434  1.00110176  0.79683577  0.67487591]]
print(np.all(np.isclose(np.matmul(b, np.linalg.inv(a)), np.linalg.solve(a.transpose(), b.transpose()).transpose())))
# True

对于足够大的输入,速度也快得多:

n, m = 400, 200
np.random.seed(0)
a = np.random.random((n, n))
b = np.random.random((m, n))
print(np.all(np.isclose(np.matmul(b, np.linalg.inv(a)), np.linalg.solve(a.transpose(), b.transpose()).transpose())))
# True
%timeit np.matmul(b, np.linalg.inv(a))
# 100 loops, best of 3: 13.3 ms per loop
%timeit np.linalg.solve(a.transpose(), b.transpose()).transpose()
# 100 loops, best of 3: 7.71 ms per loop

我的问题是:这个身份是否总是正确的,或者有一些我忽略了的极端情况?

一般来说,np.linalg.solve(B, A)等同于B-1A。剩下的只是数学。

在所有情况下,(AB)T= BTAT:https://math.stackexchange.com/q/1440305/295281。

对于这种情况不是必需的,但对于可逆矩阵,(AB)-1= B-1A-1:https://math.stackexchange.com/q/688339/295281。

对于可逆矩阵,情况也是(A-1)T= (AT)-1:https://math.stackexchange.com/q/340233/295281。

由此可知(AB-1)T= (B-1)TAT= (BT)-1AT.只要B是可逆的,在任何情况下您提出的转换都应该没有问题。

相关内容

  • 没有找到相关文章

最新更新