【发布时间】:2013-12-17 10:23:13
【问题描述】:
有没有办法在 SymPy 中隐式定义符号矩阵的元素,遵循以下规则:symbol 后跟 subindices 在矩阵(或数字对)
例如,我想定义一个名为 M 的 3 x 2 矩阵,我希望 SymPy 自动创建它并将其填充为:
M =
[ M_11 M_12]
[ M_21 M_22]
[ M_31 M_32]
如果无法隐式执行此操作,那么显式执行此操作的最简单方法是什么(例如循环)?
【问题讨论】:
有没有办法在 SymPy 中隐式定义符号矩阵的元素,遵循以下规则:symbol 后跟 subindices 在矩阵(或数字对)
例如,我想定义一个名为 M 的 3 x 2 矩阵,我希望 SymPy 自动创建它并将其填充为:
M =
[ M_11 M_12]
[ M_21 M_22]
[ M_31 M_32]
如果无法隐式执行此操作,那么显式执行此操作的最简单方法是什么(例如循环)?
【问题讨论】:
考虑使用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₂₁ ⎦
【讨论】:
这样的事情怎么样:
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) 填充它。我们将 1 添加到 i 和 j 是因为您希望矩阵为 1 索引,而不是像 Python 中的标准那样为 0 索引。
【讨论】: