我有一些包含sin(q)、cos(q)以及它们的和/积的大型矩阵需要导出。Sympy可以计算并将其导出到Octave,这非常棒!但是,由于这些都是大型矩阵,我需要某种形式的cse甚至更好的专门优化。
我找到了一个关于带有cse的C代码的很好的教程。所以我试图自己进行移植,但我在打印机类中遇到了一些细节问题。我认为这是无限递归导致的
我的问题是:是否有示例展示了sympy-octave代码生成和优化如何结合使用?或者有没有人能够帮助我运行附加的mwe?
我找到了一个关于带有cse的C代码的很好的教程。所以我试图自己进行移植,但我在打印机类中遇到了一些细节问题。我认为这是无限递归导致的
RecursionError: maximum recursion depth exceeded
。我的问题是:是否有示例展示了sympy-octave代码生成和优化如何结合使用?或者有没有人能够帮助我运行附加的mwe?
import sympy as sp
t = sp.symbols('t')
from sympy.printing.octave import OctaveCodePrinter
from sympy.printing.octave import Assignment
class matlabMatrixPrinter(OctaveCodePrinter):
def _print_ImmutableDenseMatrix(self, expr):
sub_exprs, simplified = sp.cse(expr)
lines = []
for var, sub_expr in sub_exprs:
lines.append( self._print(Assignment(var, sub_expr)))
M = sp.MatrixSymbol('M', *expr.shape)
return '\n'.join(lines) + '\n' + self._print(Assignment(M, expr))
tmp = sp.sin(t)+sp.sin(t)**2
tmp = sp.ImmutableDenseMatrix((1,1,tmp))
se, ex = sp.cse(tmp)
print((ex,se))
print('\n')
#tmp = sp.Matrix([2*sp.sin(t),sp.sin(t)])
p = matlabMatrixPrinter()
print(p.doprint(tmp))
编辑:我现在明白了,return语句中的第二个赋值也运行了函数_print_ImmutableDenseMatrix,因此这最终成为了递归。我不知道为什么在教程中C代码没有问题,但在这里会运行递归。似乎只是简化的表达式本身不能调用self._print函数的问题。也许有人知道这些打印机是如何打印矩阵和这个单一赋值的吗?!