Автоматически заполнять матричные элементы в SymPy - PullRequest
7 голосов
/ 29 июля 2011

Есть ли способ неявного определения элементов символьной матрицы в SymPy, следуя правилу, например: символ , за которым следует подиндексы в матрице (или парах чисел)

Например, я хотел бы определить матрицу 3 x 2 с именем M, и я бы хотел, чтобы SymPy автоматически создал ее и заполнил ее следующим образом:

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

Если нетспособ сделать это неявно, что было бы самым простым способом сделать это явно (например, цикл)?

Ответы [ 2 ]

16 голосов
/ 17 декабря 2013

Рассмотрите возможность использования 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₂₁      ⎦
11 голосов
/ 30 июля 2011

Как насчет этого:

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 в качестве входных данных, которые удобно являются индексами матрицы.Для каждой пары (i, j) , которые передаются в лямбда (т. Е. Для каждого элемента матрицы), мы создаем новую символическую переменную M_ij . sympy.var () принимает в качестве входных данных строку, определяющую имя новой символической переменной.Мы генерируем эту строку на лету, используя строку формата 'M_% d% d' и заполняя ее (i + 1, j + 1) .Мы добавляем 1 к i и j , потому что вы хотите, чтобы матрица была проиндексирована на 1, а не на 0, как стандарт в Python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...