使用 `np.linalg.solve()` 计算 `AB?¹`

nor*_*ok2 7 python numpy linear-algebra matrix-inverse

我需要AB?¹在 Python/Numpy 中计算两个矩阵ABB当然是正方形)。

我知道这np.linalg.inv()可以让我计算B?¹,然后我可以乘以A。我也知道,B?¹A实际上是更好地与计算np.linalg.solve()

受此启发,我决定AB?¹np.linalg.solve(). 我得到了一个基于身份 的公式(AB)? = B?A?,它使用np.linalg.solve().transpose()

np.linalg.solve(a.transpose(), b.transpose()).transpose()
Run Code Online (Sandbox Code Playgroud)

这似乎在做这项工作:

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
Run Code Online (Sandbox Code Playgroud)

并且对于足够大的输入也会更快地出现:

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
Run Code Online (Sandbox Code Playgroud)

我的问题是:这个身份总是正确的还是我忽略了一些极端情况?

Mad*_*ist 8

一般来说,np.linalg.solve(B, A)相当于。剩下的就是数学了。B-1A

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

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

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

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

  • 我不知道为什么我们需要“(AB)⁻1 = B⁻1A⁻1”。对于其余的,这正是我的想法。 (2认同)
  • @诺罗克2。为了更好的衡量:)。在我意识到我不会使用它之前我添加了它。我把它留在里面是因为它不疼。我现在在它前面加了一个注释。 (2认同)