Sympy中Matrix.factor()因非交换标量报错,求符号矩阵提公因子方案
解决Sympy符号矩阵提取公因子的问题
问题原因
Sympy的factor()方法主要针对标量表达式设计,而矩阵乘法具有非交换性,直接对MatrixSymbol构造的表达式调用factor()会触发非交换因子的不支持错误。
可行解决方案
方法1:使用collect()函数提取公因子
collect()可以识别表达式中的公共子表达式,并结合自定义逻辑提取矩阵公因子:
import sympy as sy N = sy.Symbol("N", integer=True, positive=True) P = sy.Symbol("P", integer=True, positive=True) X = sy.MatrixSymbol("X", N, P) Y = sy.MatrixSymbol("Y", N, P) example = X * X.T + Y * X.T # 收集右侧公因子X.T,构造(X+Y)*X.T形式 result = sy.collect(example, X.T, func=lambda expr, coeff: coeff * X.T) print(result) # 输出 (X + Y)*X.T
方法2:手动构造并验证等价性
如果明确公因子位置,可直接构造因式分解后的表达式,并用expand()验证与原表达式等价:
import sympy as sy N = sy.Symbol("N", integer=True, positive=True) P = sy.Symbol("P", integer=True, positive=True) X = sy.MatrixSymbol("X", N, P) Y = sy.MatrixSymbol("Y", N, P) example = X * X.T + Y * X.T # 构造目标表达式 result = (X + Y) * X.T # 验证等价性 print(sy.expand(result) == example) # 输出 True
补充说明
对于更复杂的矩阵表达式因式分解,可参考Sympy的sympy.matrices.expressions.factorization模块,但这类简单的右侧公因子提取,collect()已足够高效。
内容的提问来源于stack exchange,提问作者conjectures
相关产品推荐
相关产品推荐

