После многих экспериментов я чувствую, что все еще понимаю лишь некоторые намерения, стоящие за преднамеренным рабочим процессом codePrinter. Тем не менее, я написал подкласс, который работает точно так, как я планировал (осторожно, поскольку это, вероятно, не работает ни с чем, кроме матриц)!
Может быть, это кому-то пригодится! Для меня это определенно подтверждает, что 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];
Как описано выше: используйте на свой страх и риск:)