在SymPy中自动填充矩阵元素

Ame*_*ina 7 python sympy

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

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

M = 
[ M_11 M_12]
[ M_21 M_22]
[ M_31 M_32]
Run Code Online (Sandbox Code Playgroud)

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

MRo*_*lin 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??      ?
Run Code Online (Sandbox Code Playgroud)


Bre*_*ood 11

这样的事情怎么样:

import sympy

M = sympy.Matrix(3, 2, lambda i,j:sympy.var('M_%d%d' % (i+1,j+1)))
Run Code Online (Sandbox Code Playgroud)

编辑:我想我应该添加一个小解释.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索引.