Получение поэлементных уравнений умножения матриц в sympy

У меня есть 2 матрицы, первая из которых разреженная с целыми коэффициентами.

import sympy
A = sympy.eye(2)
A.row_op(1, lambda v, j: v + 2*A[0, j])

Вторая - символическая, и я выполняю между ними операцию:

M = MatrixSymbol('M', 2, 1)
X = A * M + A.col(1)

Теперь мне бы хотелось получить поэлементные уравнения:

X_{0,0} = A_{0,0}
X_{0,1} = 2*A_{0,0} + A_{0,1}

Один из способов сделать это - указать матрицу в sympy, где каждый элемент является отдельным символом:

rows = []
for i in range(shape[0]):
    col = []
    for j in range(shape[1]):
        col.append(Symbol('%s_{%s,%d}' % (name,i,j)))
    rows.append(col)
M = sympy.Matrix(rows)

Есть ли способ сделать это с помощью MatrixSymbol выше, а затем получить результирующие поэлементные уравнения?


person Michael Schubert    schedule 15.02.2015    source источник


Ответы (1)


Оказывается, на этот вопрос есть очень очевидный ответ:

MatrixSymbol в sympy можно индексировать как матрицу, т. е .:

X[i,j]

дает поэлементные уравнения.

Если кто-то хочет подмножество более чем одного элемента, MatrixSymbol необходимо сначала преобразовать в класс sympy.Matrix:

X = sympy.Matrix(X)
X        # lists all indices as `X[i, j]`
X[3:4,2] # arbitrary subsets are supported

Обратите внимание, что это не позволяет выполнять все операции с массивом / матрицей numpy (например, индексирование с помощью логического эквивалента), поэтому вам может быть лучше создать массив numpy с символами sympy:

ijstr = lambda i,j: sympy.Symbol(name+"_{"+str(int(i))+","+str(int(j))+"}")
matrix = np.matrix(np.fromfunction(np.vectorize(ijstr), shape))
person Michael Schubert    schedule 16.02.2015