【问题标题】:Pythonic Matrix Multiplication [duplicate]Pythonic矩阵乘法[重复]
【发布时间】: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 了!

标签: python numpy matrix


【解决方案1】:

试试@速记:

M = A - B.T@C@B

【讨论】:

    猜你喜欢
    • 2012-02-07
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 2020-05-08
    • 2013-08-17
    • 2014-03-01
    相关资源
    最近更新 更多