代码之家  ›  专栏  ›  技术社区  ›  Taylor Fang

优化此涉及矩阵反转的Python代码

  •  1
  • Taylor Fang  · 技术社区  · 1 年前

    我有一行代码,涉及矩阵求逆:

    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是对称的这一事实。

    1 回复  |  直到 1 年前
        1
  •  0
  •   jared    1 年前

    所以你的问题是 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