【问题标题】:MatrixSymbol substitution in sympysympy 中的 MatrixSymbol 替换
【发布时间】:2018-07-17 17:53:26
【问题描述】:

我在替换 sympy 中的 MatrixSymbols 时遇到问题。这是一个基本的代码示例:

>>> import sympy as sy
>>> x, y = sy.symbols('x y')
>>> v = sy.MatrixSymbol('v', 2, 1)
>>> w = sy.MatrixSymbol('w', 2, 1)
>>> 2 + 3
5
>>> (x + y).subs({x: 2, y: 3})
5
>>> sy.Matrix([2,2]) + sy.Matrix([3,3])
Matrix([
[5],
[5]])
>>> (v + w).subs({v: sy.Matrix([2,2]), w: sy.Matrix([3,3])})
Matrix([
[2],
[2]]) + Matrix([
[3],
[3]])
>>> (v + w).subs({v: sy.Matrix([2,2]), w: sy.Matrix([3,3])}).evalf()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-9-25398137decd> in <module>()
----> 1 (v+w).subs({v: sy.Matrix([2,2]), w: sy.Matrix([3,3])}).evalf()

AttributeError: 'MatAdd' object has no attribute 'evalf'

我希望 MatrixSymbols vw 的行为类似于标量符号 xy,但事实并非如此。

有没有一种方法可以通过插入 vw 的向量来评估像 v + w 这样的表达式?

【问题讨论】:

    标签: matrix sympy substitution


    【解决方案1】:

    我认为您正在寻找as_explicit,这是一种矩阵表达式的方法,可将其转换为显式矩阵

    (v + w).subs({v: sy.Matrix([2,2]), w: sy.Matrix([3,3])}).as_explicit()
    

    Matrix([[5], [5]])

    【讨论】:

    • 很好,这很有效,但现在我想知道为什么sy.Matrix([2,2]) + sy.Matrix([3,3]) 返回显式矩阵而不是矩阵表达式。或者换句话说,我对使用 subs 替换时与使用手动复制粘贴替换时给出不同返回类型的理由感到困惑。
    • 矩阵表达式是带有矩阵符号的表达式。 sy.Matrix([2,2]) + sy.Matrix([3,3]) 中没有矩阵符号,只有显式矩阵。所以结果是一个显式矩阵。
    • 知道了,谢谢。所以也许我仍然不明白subs 是如何工作的。我知道v + w是一个带有矩阵符号的表达式,但是为什么(v + w).subs({v: sy.Matrix([2,2]), w: sy.Matrix([3,3])})是一个带有矩阵符号的表达式呢?它评估为没有符号的Matrix([ [2], [2]]) + Matrix([ [3], [3]])
    • 这是一个不幸的结果,因为矩阵表达式有自己的加法运算符 MatAdd(不同于常规加法 Add)。两者都打印为+,但工作方式不同。添加 MatrixSymbol 对象会创建一个 MatAdd。替换MatAdd 的参数我们得到一个奇怪的情况:没有矩阵符号的矩阵表达式(理想情况下不应该发生)。它不评估,因为它是 MatAdd 而不是 Add。在 SymPy 表达式上尝试sy.srepr(...),看看它真正是什么。
    • 感谢您将我指向srepr,下次我感到困惑时会很有用。并感谢您的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    • 2017-05-31
    • 1970-01-01
    相关资源
    最近更新 更多