在SymPy中自动填充矩阵元素

时间:2011-07-29 17:56:51

标签: python sympy

是否有办法在SymPy中隐式定义符号矩阵的元素,遵循以下规则:符号,后跟矩阵中的子指示(或数字对) )

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

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

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

2 个答案:

答案 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₂₁      ⎦

答案 1 :(得分: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 正式定义它。此函数将变量 i j 作为输入,这很方便地是矩阵的索引。对于传递到 lambda 的每一对(i,j)(即,对于矩阵的每个元素),我们创建一个新的符号变量 M_ij 即可。 sympy.var()将一个字符串作为输入,用于定义新符号变量的名称。我们使用格式字符串'M_%d%d'即时生成此字符串,并使用(i + 1,j + 1)填充它。我们在 i j 中添加1,因为您希望矩阵为1索引,而不是像Python中的标准那样0索引。