用“np.linalg.solve()”计算“AB”

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

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

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

受此启发,我决定用np.linalg.solve()重写AB⁻¹。我得到了一个基于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

我的问题是:这个身份总是站正确有一些角落的情况下,我俯瞰?

8

一般来说,np.linalg.solve(B, A)相当于B-1A,其余的只是数学。

In all cases,(AB)T= BTAT:https://math.stackexchange.com/q/1440305/295281.

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

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

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

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(661)
可访问性:YouTube嵌入代码应具有标题属性
上一篇
Sql查询以计算DuneAnalytics中的平均每日交易量
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(55条)