首页 文章

在SymPy中自动填充矩阵元素

提问于
浏览
7

有没有办法在SymPy中隐式定义符号矩阵的元素遵循规则,例如: symbol 后跟矩阵中的 subindices (或数字对)

例如,我想定义一个名为 M 的3 x 2矩阵,我希望SymPy自动创建它并将其填充为:

M = 
[ M_11 M_12]
[ M_21 M_22]
[ M_31 M_32]

如果无法隐式执行此操作,那么显式执行此操作的最简单方法是什么(例如循环)?

2 回答

  • 11

    这样的事情怎么样:

    import sympy
    
    M = sympy.Matrix(3, 2, lambda i,j:sympy.var('M_%d%d' % (i+1,j+1)))
    

    编辑:我想我应该添加一个小解释 . sympy.Matrix() 的前两个参数将矩阵定义为3x2(如您所指定) . 第三个参数是 lambda 函数,它本质上是在一行中定义函数的简写方式,而不是用 def 正式定义它 . 此函数将变量 ij 作为输入,它们很方便地是矩阵的索引 . 对于传递到 lambda 的每一对 (i,j) (即,对于矩阵的每个元素),我们正在创建一个新的符号变量 M_ij . sympy.var() 将字符串作为输入,用于定义新符号变量的名称 . 我们使用格式字符串 'M_%d%d' 动态生成此字符串并使用 (i+1,j+1) 填充它 . 我们正在向 ij 添加1,因为您希望矩阵为1索引,而不是像Python中的标准那样0索引 .

  • 16

    考虑使用 MatrixSymbol 而不是 Matrix 对象 . MatrixSymbol 表示矩阵而不需要显式元素 .

    In [1]: M = MatrixSymbol('M', 3, 2)
    
    In [2]: M  # Just an expression
    Out[2]: M
    
    In [3]: Matrix(M)  # Turn it into an explicit matrix if you desire
    Out[3]: 
    ⎡M₀₀  M₀₁⎤
    ⎢        ⎥
    ⎢M₁₀  M₁₁⎥
    ⎢        ⎥
    ⎣M₂₀  M₂₁⎦
    
    
    In [4]: M.T * M   # Still just an expression
    Out[4]: 
     T  
    M ⋅M
    
    In [5]: Matrix(M.T * M)  # Fully evaluate
    Out[5]: 
    ⎡       2      2      2                                  ⎤
    ⎢    M₀₀  + M₁₀  + M₂₀        M₀₀⋅M₀₁ + M₁₀⋅M₁₁ + M₂₀⋅M₂₁⎥
    ⎢                                                        ⎥
    ⎢                                    2      2      2     ⎥
    ⎣M₀₁⋅M₀₀ + M₁₁⋅M₁₀ + M₂₁⋅M₂₀      M₀₁  + M₁₁  + M₂₁      ⎦
    

相关问题