【发布时间】:2020-04-02 11:23:06
【问题描述】:
我正在尝试实现对称矩阵的 Schur Complement 的计算。这个值的等式是:
M = A - B^T C B
其中A、B、C是矩阵的块分量
S = (A | B^T)
(B | C )
假设我已经为 A、B 和 C 定义了 numpy 数组:
- A 是一个 3x3 矩阵
- B 是一个 3x2 矩阵
- C 是一个 2x2 矩阵
我已经使用numpy执行了获取S的操作:
M = A - np.matmul(B.T, np.matmul(C, B))
假设这是正确的操作,有没有更pythonic的方式来编写这段代码?
亲切的问候!
编辑:
如果我使用的是 Python 3.5+,那么建议的 @ 解决方案将是理想的。
我的问题的原因是,如果一个人正在执行一组复杂的矩阵乘法,那么如果不在每个步骤中定义新变量,使用嵌套的 np.matmult() 或 np.dot() 就会变得非常难以阅读。
例如,对于等式M = A^-1 - C^TXC 变为
np.linalg.inv(A) - np.dot(C.T, np.dot(X,C))
或
np.linalg.inv(A) - np.matmult(C.T, np.matmult(X,C))
嵌套使得检查运算符顺序是否正确变得更加困难,因为:
np.linalg.inv(A) - np.matmult(C.T, np.matmult(X,C)) != np.linalg.inv(A) - np.matmult(C.T, np.matmult(C,X))
(在大多数情况下)
相比之下:
np.linalg.inv(A) - C.T @ X @ C
清楚的让读者知道这行代码是怎么回事,可以查看操作符的顺序。
【问题讨论】:
-
``` M = A - np.matmul(B.T, np.matmul(C, B)) ``` 似乎已经是 Pythonic 了!