Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 生成C代码。将有理数转换为浮点数_Python_Python 3.x_Sympy_Code Generation_Codegen - Fatal编程技术网

Python 生成C代码。将有理数转换为浮点数

Python 生成C代码。将有理数转换为浮点数,python,python-3.x,sympy,code-generation,codegen,Python,Python 3.x,Sympy,Code Generation,Codegen,我试图通过函数ccode用sympy生成C代码 目前,我正在尝试将Symphy的有理数转换为浮点数,以加快计算速度 例如,我有: import sympy as sp x=sp.Symbol('x') y=sp.Symbol('y') d=sp.Symbol('d') test=sp.Matrix([ [x/3 + y + 2*d/3, 0, 0], [0, x/3 + y + 2*d/3, 0], [0, 0, x/3 + y - 2*d/3]]) res = sp.cse

我试图通过函数ccode用sympy生成C代码

目前,我正在尝试将Symphy的有理数转换为浮点数,以加快计算速度

例如,我有:

import sympy as sp
x=sp.Symbol('x')
y=sp.Symbol('y')
d=sp.Symbol('d')

test=sp.Matrix([
 [x/3 + y + 2*d/3,    0,   0],
 [0, x/3 + y + 2*d/3, 0],
 [0, 0, x/3 + y - 2*d/3]])

res = sp.cse(test)
lines = []

   
for i, result in enumerate(res):
        lines.append(sp.ccode(result,"result_%i"%i, user_functions={'Mul':[(lambda x: x.args[0].is_Rational, lambda x: sp.N(x,n=17))]}))
    
如果
res
的矩阵部分有一个分数(
res[1]
),我可以用for循环和try/except语句循环它:

for i in range(len(res[1])):
        try:
            res[1][i].args[0].is_Rational       
        except:
            continue
        else:
            res[1][i]=sp.N(res[0][i],n=20)
并使用函数
sp.N
将有理值更改为浮点值。 但是,我很难定义lambda函数/任何其他函数来对
res[0]
中的元组列表执行此操作

谢谢你的帮助


您可以采取与中类似的方法:将代码生成器子类化并覆盖
\u print\u Rational()
。可通过
设置=
参数添加自定义
用户功能

import sympy as sp
from sympy.printing.c import C99CodePrinter

class CustomCodePrinter(C99CodePrinter):
    def _print_Rational(self, expr):
        return str(sp.N(expr))

my_user_functions = {"cos": "my_fast_cos"}

custom_ccode = CustomCodePrinter(settings={'user_functions': my_user_functions}).doprint
print(custom_ccode(sp.Rational(1, 7) + sp.cos(sp.Rational(1, 3))))

为了能够使用
ccode
中的
user\u函数
,这样做是否是一种好的做法

from sympy.printing.c import C99CodePrinter
class CustomCodePrinter(C99CodePrinter):
    def _print_Rational(self, expr):
        return str(sp.N(expr, n = 17))
    

def customccode(expr, assign_to=None, **settings):
    return CustomCodePrinter(settings).doprint(expr, assign_to)

这实际上对这个案子有好处!是否仍要传递
CustomCodePrinter
中的
用户功能?我得到以下错误:<代码> Type Error:DoprTrn()得到了一个意想不到的关键字参数“UsRySuffic函数”。如果这回答了你的问题,你可以考虑把答案标记为。你的问题现在解决了吗?还是还有什么不清楚的地方?