2011-07-29 24 views
7

¿Hay una manera de definir implícitamente los elementos de una matriz simbólica en sympy siguiendo una regla como: símbolo seguido de subíndices en la matriz (o pares de números)pueblan automáticamente elementos de matriz en sympy

Por ejemplo, me gusta definir una matriz de 3 x 2 llamada M, y me gustaría sympy para crear automáticamente y poblarlo como:

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

Si no hay manera de hacer esto de forma implícita, lo que haría ser la forma más fácil de hacer esto ex implícitamente (p. bucle)?

Respuesta

10

¿Qué tal algo como esto:

import sympy 

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

Editar: supongo que debería añadir una pequeña explicación. Los primeros dos argumentos para sympy.Matrix() definen la matriz como 3x2 (como usted especificó). El tercer argumento es una función lambda, que es esencialmente una forma abreviada de definir una función en una línea, en lugar de definirla formalmente con def. Esta función toma las variables i y j como entrada, que convenientemente son los índices de la matriz. Para cada par (i, j) que se pasan al lambda (es decir, para cada elemento de la matriz), estamos creando una nueva variable simbólica M_ij. sympy.var() toma una cadena como entrada que define el nombre de la nueva variable simbólica. Generamos esta cadena sobre la marcha usando el formato de cadena 'M_% d% d' y llenándolo con (i + 1, j + 1). Estamos agregando 1 a i y j porque desea que la matriz tenga 1 índice, en lugar de 0, como es el estándar en Python.

+0

Eso funciona muy bien. Gracias por la explicación también. –

15

Considere usar el objeto MatrixSymbol en lugar de Matrix. MatrixSymbol representa matrices sin la necesidad de elementos explícitos.

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