在sympy中使用公因数来显示矩阵

7
我希望在sympy中进行矩阵计算后,将提取的公共因子放在矩阵外部显示。
我编写了以下代码。
from sympy import *
a = symbols("a")
b = symbols("b")

A = Matrix([exp(I*a),exp(I*a)*exp(I*b)])
print simplify(A)

我得到了以下输出。
Matrix([
[      exp(I*a)],
[exp(I*(a + b))]])

然而,我想得到以下输出。

exp(I*a)*Matrix([
[      1],
[exp(I*b)]])

我尝试使用 collect(A,exp(I*a)),但出现了以下错误。
Traceback (most recent call last):

  File "<ipython-input-65-834f4c326df4>", line 1, in <module>
    runfile('C:/Anaconda2/Programs/test/untitled44.py', wdir='C:/Anaconda2/Programs/test')

  File "C:\Anaconda2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 699, in runfile
    execfile(filename, namespace)

  File "C:\Anaconda2\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 74, in execfile
    exec(compile(scripttext, filename, 'exec'), glob, loc)

  File "C:/Anaconda2/Programs/test/untitled44.py", line 14, in <module>
    collect(A,exp(I*a))

  File "C:\Anaconda2\lib\site-packages\sympy\simplify\simplify.py", line 451, in collect
    if expr.is_Mul:

  File "C:\Anaconda2\lib\site-packages\sympy\matrices\matrices.py", line 3084, in __getattr__
    "%s has no attribute %s." % (self.__class__.__name__, attr))

AttributeError: MutableDenseMatrix has no attribute is_Mul.

我知道一种方法可以提取矩阵元素的公共因子,类似于以下链接。 https://github.com/sympy/sympy/issues/8442

但这不是我的愿望。

我该怎么办?


每当您遇到错误时,请确保在问题中包含整个错误消息。 - ForceBru
对于我的不完整,我感到抱歉。我尝试添加了collect命令,但是收到了错误消息。 - user6695701
1个回答

10

我认为Sympy没有提供你想要的功能。但是,你可以按照在Mathematica SE上类似问题的被接受答案中提出的方法手动完成此操作(link)。

这个方法的思路是通过gcd提取多项式元素的公共因子,然后使用带有evaluate=False选项的MatMul来限制Sympy执行标量-矩阵乘法。

import sympy as sp

a, b = sp.symbols('a, b')

A = sp.Matrix([sp.exp(sp.I * a), sp.exp(sp.I * a) * sp.exp(sp.I * b)])
g = sp.gcd(tuple(A))

A_v2 = sp.MatMul(g,(A/g),evaluate = False)
print(A_v2)
exp(I*a)*Matrix([
[       1],
[exp(I*b)]])

非常感谢您的帮助。这是一个不错的方式! - user6695701
你应该使用 MatMul 来进行矩阵乘法。 - asmeurer
@asmeurer 谢谢您的纠正。已编辑答案。 - Stelios

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接