我有这行涉及矩阵求逆的代码:
X = A @ B @ np.linalg.pinv(S)
A 是一个 n × n 矩阵,B 是一个 n × m 矩阵,S 是一个 m × m 矩阵。 m 比 n 小,但通常不会小几个数量级。通常m大约是n的一半。 S 是对称正定矩阵。
如何让这行代码在Python中运行得更快?
我可以做
X = np.linalg.solve(S.T, (A@B).T).T
但我也很好奇是否可以利用 S 是对称的这一事实。
所以你的问题是
XS = AB = C
。正如您所说,这可以重写为 S'X' = B'A' = C'
。 C
的大小为m x n
,但是这个批量问题可以使用scipy.linalg.solve
来解决。在这种情况下,我推荐使用 scipy 替代方案(而不是 numpy),因为您已经声明 S
是对称的,因此您可以传递 assume_a="sym"
参数,以便 scipy 选择利用矩阵结构的求解器。
所以,你的代码将如下所示:
X = scipy.linalg.solve(S.T, (A@B).T, assume_a="sym").T