如何在矩阵运算中代入数值但不执行计算求解?
实现SymPy矩阵运算的表达式可视化(不自动计算)
方法1:自定义矩阵类重载运算符
通过继承SymPy的Matrix类,重载核心运算方法,让每个元素以未计算的表达式形式保留,而非自动化简。
from sympy import Matrix, Add, Mul, Integer class ExprMatrix(Matrix): def __add__(self, other): if not isinstance(other, Matrix): other = self.__class__([[other]*self.shape[1]]*self.shape[0]) # 逐个元素生成Add表达式,不化简 new_elements = [[Add(self[i,j], other[i,j], evaluate=False) for j in range(self.shape[1])] for i in range(self.shape[0])] return self.__class__(new_elements) def __mul__(self, other): if isinstance(other, (int, float, Integer)): # 数乘:生成Mul表达式,不化简 new_elements = [[Mul(self[i,j], other, evaluate=False) for j in range(self.shape[1])] for i in range(self.shape[0])] return self.__class__(new_elements) elif isinstance(other, Matrix): # 矩阵乘法:按乘法规则生成Add+Mul的嵌套表达式,不化简 new_elements = [] for i in range(self.shape[0]): row = [] for j in range(other.shape[1]): terms = [Mul(self[i,k], other[k,j], evaluate=False) for k in range(self.shape[1])] row.append(Add(*terms, evaluate=False)) new_elements.append(row) return self.__class__(new_elements) # 处理右数乘(比如 2 * A) __rmul__ = __mul__
用法示例
# 初始化自定义矩阵 A = ExprMatrix([[-7, 0], [4, 0]]) B = ExprMatrix([[2, 0], [-3, -3]]) # 矩阵加法 print("A + B =") print(A + B) # 输出: # [[-7 + 2, 0 + 0], [4 + (-3), 0 + (-3)]] # 数乘 print("\n2 * A =") print(2 * A) # 输出: # [[2*(-7), 2*0], [2*4, 2*0]] # 矩阵乘法 print("\nA * B =") print(A * B) # 输出: # [[(-7)*2 + 0*(-3), (-7)*0 + 0*(-3)], [4*2 + 0*(-3), 4*0 + 0*(-3)]]
方法2:手动构造表达式矩阵(轻量方案)
如果不想自定义类,可以手动遍历矩阵元素,用evaluate=False的SymPy表达式构造新矩阵:
from sympy import Matrix, Add, Mul A = Matrix([[-7, 0], [4, 0]]) B = Matrix([[2, 0], [-3, -3]]) # 构造加法表达式矩阵 add_expr = Matrix([[Add(A[i,j], B[i,j], evaluate=False) for j in range(A.shape[1])] for i in range(A.shape[0])]) print(add_expr) # 输出:[[-7 + 2, 0 + 0], [4 + (-3), 0 + (-3)]] # 构造数乘表达式矩阵 mul_expr = Matrix([[Mul(3, A[i,j], evaluate=False) for j in range(A.shape[1])] for i in range(A.shape[0])]) print(mul_expr) # 输出:[[3*(-7), 3*0], [3*4, 3*0]]
关键说明
- 核心是利用SymPy的
Add、Mul函数的evaluate=False参数,强制保留表达式结构,不自动计算结果。 - 自定义类方案适合需要频繁进行多种矩阵运算的场景,一次定义后可直接用运算符操作;手动构造适合单次运算的轻量需求。
内容的提问来源于stack exchange,提问作者MetalMathician
相关产品推荐
相关产品推荐

