经过大量的实验,我觉得我仍然只是理解了代码打印机故意工作流程背后的一些意图。然而,我写了一个子类,它完全按照我的意愿来做(小心,因为这可能不适用于除母系以外的任何事物!).
也许这对某人有用!对我来说,它肯定能证明sympy是一种工作工具,因为除此之外
sin
评估绝对是不可行的代码。
我仍然对某人的评论和想法非常感兴趣,谁知道应该如何实现这些特性呢!
import sympy as sp
t = sp.symbols('t')
from sympy.printing.octave import OctaveCodePrinter
from sympy.printing.octave import Assignment
class matlabMatrixPrinter(OctaveCodePrinter):
def print2(self,expr_list,names=None):
sub_exprs, simplified = sp.cse(expr_list)
lines = []
for var, sub_expr in sub_exprs:
lines.append(self._print(Assignment(var, sub_expr)))
lines.append('')
for k,expr in enumerate(simplified):
if names:
M = sp.MatrixSymbol(names[k],*expr.shape)
else:
M = sp.MatrixSymbol('M{k}'.format(k=k), *expr.shape)
lines.append(self._print(Assignment(M,expr)))
result = ''
return '\n'.join(lines)
tmp = sp.Matrix([sp.sin(t)+sp.sin(t)**2 ])
tmp2 = sp.Matrix([sp.sin(t),sp.cos(t),2*sp.sin(t),sp.cos(t)**2])
p = matlabMatrixPrinter()
#print(p.print2([tmp,tmp2]))
print(p.print2([tmp,tmp2],['scalar_matrix','matrix']));
这给出了预期的输出:
x0 = sin(t);
x1 = cos(t);
scalar_matrix = x0.^2 + x0;
matrix = [x0; x1; 2*x0; x1.^2];
如上所述:自担风险使用:)