在sympy中获取矩阵乘法的逐元素方程
Getting element-wise equations of matrix multiplication in sympy
我有 2 个矩阵,第一个是整数系数的稀疏矩阵。
import sympy
A = sympy.eye(2)
A.row_op(1, lambda v, j: v + 2*A[0, j])
第2个是symbolic,我在他们之间做一个运算:
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
来做,然后得到结果的逐元素方程?
事实证明,这个问题有一个非常明显的答案:
sympy 中的 MatrixSymbol
s 可以像矩阵一样进行索引,即:
X[i,j]
给出元素方程。
如果要对多个元素进行子集化,必须先将 MatrixSymbol
转换为 sympy.Matrix
class:
X = sympy.Matrix(X)
X # lists all indices as `X[i, j]`
X[3:4,2] # arbitrary subsets are supported
请注意,这不允许 numpy
array/matrix 的所有操作(例如使用布尔等效项进行索引),因此您最好创建一个 numpy
数组sympy
符号:
ijstr = lambda i,j: sympy.Symbol(name+"_{"+str(int(i))+","+str(int(j))+"}")
matrix = np.matrix(np.fromfunction(np.vectorize(ijstr), shape))
我有 2 个矩阵,第一个是整数系数的稀疏矩阵。
import sympy
A = sympy.eye(2)
A.row_op(1, lambda v, j: v + 2*A[0, j])
第2个是symbolic,我在他们之间做一个运算:
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
来做,然后得到结果的逐元素方程?
事实证明,这个问题有一个非常明显的答案:
sympy 中的MatrixSymbol
s 可以像矩阵一样进行索引,即:
X[i,j]
给出元素方程。
如果要对多个元素进行子集化,必须先将 MatrixSymbol
转换为 sympy.Matrix
class:
X = sympy.Matrix(X)
X # lists all indices as `X[i, j]`
X[3:4,2] # arbitrary subsets are supported
请注意,这不允许 numpy
array/matrix 的所有操作(例如使用布尔等效项进行索引),因此您最好创建一个 numpy
数组sympy
符号:
ijstr = lambda i,j: sympy.Symbol(name+"_{"+str(int(i))+","+str(int(j))+"}")
matrix = np.matrix(np.fromfunction(np.vectorize(ijstr), shape))