我用SymPy来计算符号矩阵,但是,某些语句非常大。似乎有一种方法可以进一步简化它们。我用过simplify(),但我没有成功地得到我想要的东西。在
最后一个语句有两个加法和一个矩阵乘法。我想知道有没有什么方法也可以执行右边的矩阵乘法,这样我们就可以简单地得到3个矩阵求和了?在
我知道这可以通过手工进行某些代数操作来实现,但我更感兴趣的是一个要执行的命令,比如命令将整个语句作为输入,并进行所有简化,包括任何乘法和加法,并输出我需要的内容。所有这些都应该使用sympy完成。换言之,如果一个加法或乘法可以完成,那么我希望它完成,而不是不做。在
这是MCVE,它模仿了我的问题from sympy import *
init_printing()
J_22 = MatrixSymbol(‘J_22’, 3, 3)
COV_b=Matrix([[2,1,1],[1,2,1],[1,1,2]])
(COV_b+J_22)*COV_b
此代码的输出是
但是,我想把这个作为输出
我明白在这个简单的例子中,我可以通过下面的代码简单地解决这个问题
^{pr2}$
然而,这只是一个简单的例子,在实际问题中,这在生成输出之前是看不到的。因此,我希望能够使用一个命令,它将第一个提供的代码的输出作为输入,并输出所需的输出。在
在更新:@WelcometoStackOverflow提供了一个函数,它简化了很多事情,但矩阵加法仍然没有完成。在from sympy import *
init_printing()
J_22 = MatrixSymbol(‘J_22’, 3, 3)
COV_b=Matrix([[2,1,1],[1,2,1],[1,1,2]])
T=(COV_b+J_22)*COV_b+COV_b
def expand_matmul(expr):
import itertools
for a in preorder_traversal(expr):
if isinstance(a, MatMul):
terms = [f.args if isinstance(f, MatAdd) else [f] for f in a.args]
expanded = Add(*[MatMul(*t) for t in itertools.product(*terms)])
if a != expanded:
expr = expr.xreplace({a: expanded})
return expand_matmul(expr)
return expr
expand_matmul(T)
输出是
前两个矩阵的求和仍未执行。在