代码之家  ›  专栏  ›  技术社区  ›  N. Virgo

在sympy中使用自动换行赋值

  •  1
  • N. Virgo  · 技术社区  · 6 年前

    我正在编写一些代码,使用sympy构造一个复杂的数学表达式,然后使用 autowrap 函数来编译它并重复计算它。

    不幸的是,我的表达式在某些情况下正变得指数级大。为了防止这种情况,我想生成包含赋值语句的表达式。也就是说,我想以类似(伪代码)的方式结束

    x1 = f(a,a);
    x2 = f(x1,x1);
    x3 = f(x2,x2);
    x4 = f(x3,x3);
    

    而不是

    f(f(f(a,a),f(a,a)),f(f(a,a),f(a,a))),f(f(a,a),f(a,a)),f(f(a,a),f(a,a))))

    其中每个子表达式都被替换了两次。

    似乎有一种机制,以 sympy.codegen.ast.CodeBlock 是的。然而,我似乎不知道如何让这个工作 自动换行 ,如果确实可以的话。

    如果我想这么做

    >>> f = autowrap(ast.CodeBlock(ast.Assignment(y,sym.sin(x))),backend='cython')
    

    然后我得到一个很长的堆栈跟踪

    wrapped_code_12.c:5:22: error: use of undeclared identifier 'y'
       autofunc_result = y = sin(x);
                         ^
    1 error generated.
    error: command '/usr/bin/clang' failed with exit status 1
    

    我觉得直接在里面使用代码块 自动换行 不是正确的方法。(我在使用Fortran后端时也遇到了类似的错误。)

    问题是,有没有正确的方法?我能用一下吗 CodeBlock 在里面 自动换行 ,或者有其他方法可以生成中间变量 自动换行 而不是总是让我的同情表达完全展开?

    0 回复  |  直到 6 年前