【问题标题】:matrix subs in sympy同情中的矩阵潜艇
【发布时间】:2016-01-25 15:19:34
【问题描述】:

我正在尝试使用 sympy 计算一些带有矩阵的符号表达式。 sympy 函数 subs 的行为对于矩阵来说很奇怪。我需要的是用符号表达式取字符串,用一些特定的矩阵代替这个表达式中的符号并计算结果。

对于标量,sympy.subs 可以完成这项工作:

import sympy as sp
sp.sympify("x1*x2**2").subs({"x1":5,"x2":10})

按预期给出 500。

如果改为标量,我会使用像

这样的矩阵
sp.sympify("x1*x2**2").subs({"x1":sp.Matrix([[0,1],[1,0]]),"x2":sp.Matrix([[1,0],[0,1]])}

结果是AttributeError: 'MatPow' object has no attribute 'as_base_exp'。这看起来很奇怪,只要

aa,bb = sp.Matrix([[0,1],[1,0]]), sp.Matrix([[1,0],[0,1]])
aa*bb**2

按预期工作。

在 sympy 中执行此类计算的正确方法是什么?

【问题讨论】:

    标签: sympy substitution


    【解决方案1】:

    sympify 会将x1x2 转换为符号,但要使其工作,它们需要是矩阵符号,例如

    x1 = MatrixSymbol('x1', 2, 2)
    x2 = MatrixSymbol('x2', 2, 2)
    (x1*x2**2).subs({x1: Matrix([[0,1],[1,0]]), x2: Matrix([[1,0],[0,1]])})
    

    默认情况下这是未评估的,但您可以使用.doit 评估它,例如

    (x1*x2**2).subs({x1: Matrix([[0,1],[1,0]]), x2: Matrix([[1,0],[0,1]])}).doit()
    

    【讨论】:

    • 谢谢。那么,MatrixSymbols 不是 Symbols() 吗?很难从 sympy 文档中获得。这些细微差别是否有更详细的记录?
    • 顺便说一句,我找到了另一种解决方法:from sympy.parsing.sympy_parser import parse_expr; print parse_expr("x1*x2**2", local_dict={"x1":sp.Matrix([[0,1],[1,0]]),"x2":sp.Matrix([[1,0],[0,1]])}) Matrix([[0, 1], [1, 0]])。令人惊讶的是,这也有效
    • 您也可以将locals 传递给sympify
    • @Misha MatrixSymbols 是表示矩阵的特殊符号。它们与普通符号的不同之处在于它们带有形状,如果您将它们与实际矩阵组合或将它们替换为实际矩阵(如您在此处所见),它们会做正确的事情。例如,它们在默认情况下也是不可交换的(仅当您在创建符号时设置 commutative=False 时,符号才是不可交换的)。见docs.sympy.org/latest/modules/matrices/expressions.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    相关资源
    最近更新 更多