【发布时间】:2015-11-17 05:45:04
【问题描述】:
我正在尝试使用 sympy 进行一些符号矩阵计算。我的目标是获得一些矩阵计算结果的符号表示。我遇到了一些问题,我将其归结为这个简单的示例,在该示例中,我尝试评估对指定矩阵求幂并将其乘以任意向量的结果。
>>> import sympy
>>> v = sympy.MatrixSymbol('v', 2, 1)
>>> Z = sympy.zeros(2, 2) # create 2x2 zero matrix
>>> I = sympy.exp(Z) # exponentiate zero matrix to get identity matrix
>>> I * v
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "sympy/matrices/matrices.py", line 507, in __mul__
blst = B.T.tolist()
AttributeError: 'Transpose' object has no attribute 'tolist'
相比之下,如果我直接创建单位矩阵,然后乘以v,那就没有问题了:
>>> I_ = sympy.eye(2) # directly create the identity matrix
>>> I_ == I # check the two matrices are equal
True
>>> I_ * v
v
我注意到的一件事是这两个单位矩阵属于不同的类别:
>>> I.__class__
sympy.matrices.immutable.ImmutableMatrix
>>> I_.__class__
sympy.matrices.dense.MutableDenseMatrix
我还发现调用as_mutable() 方法提供了一种解决方法。
>>> I.as_mutable() * v
v
是否总是需要在一个人的线性代数计算中使用as_mutable() 调用?我猜不是,而是这些错误表明我使用错误的策略来解决我的问题,但我无法弄清楚正确的策略是什么。有没有人指点一下?
我已经阅读了Immutable Matrices 上的文档页面,但我仍然可以使用一些帮助来了解它们与标准可变矩阵的差异在这里的重要性,以及为什么某些操作(例如 sympy.exp)在这些不同的类之间转换。
【问题讨论】:
-
仅供参考,该错误已在 sympy 的 master 分支中修复。
标签: python matrix sympy symbolic-math