gpt4 book ai didi

python - 用 `AB⁻¹` 计算 `np.linalg.solve()`

转载 作者:行者123 更新时间:2023-12-04 04:29:40 24 4
gpt4 key购买 nike

我需要计算 AB⁻¹在 Python/Numpy 中用于两个矩阵 AB ( B 当然是正方形)。

我知道np.linalg.inv()将允许我计算 B⁻¹ ,然后我可以乘以 A .
我也知道B⁻¹A实际上是 betternp.linalg.solve() 计算.

受此启发,我决定重写 AB⁻¹np.linalg.solve() 方面.
我得到了一个基于 identity 的公式(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是可逆的,在任何情况下,您提出的转换都应该没有问题。

关于python - 用 `AB⁻¹` 计算 `np.linalg.solve()`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61917521/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com