我正在尝试使用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()`调用?我猜想不一定,这些错误可能表明我正在使用错误的策略来解决问题,但我找不到正确的策略。有人能指点一下吗?
我已经阅读了关于不可变矩阵的文档页面,但我仍然需要一些帮助理解它们与标准可变矩阵的区别在这里的重要性,以及为什么一些操作(例如sympy.exp)会在这些不同的类之间进行转换。