gpt4 book ai didi

python - 使用 Sympy 生成 C 代码。用 x*x 替换 Pow(x,2)

转载 作者:行者123 更新时间:2023-12-04 15:09:05 31 4
gpt4 key购买 nike

我正在使用通用子表达式消除 (CSE) 例程和 ccode 打印机生成带有 sympy 的 C 代码。
但是,我希望将幂表达式作为 (x*x) 而不是 pow(x,2)。
无论如何要做到这一点?
例子:

import sympy as sp
a= sp.MatrixSymbol('a',3,3)
b=sp.Matrix(a)*sp.Matrix(a)

res = sp.cse(b)

lines = []

for tmp in res[0]:
lines.append(sp.ccode(tmp[1], tmp[0]))

for i,result in enumerate(res[1]):
lines.append(sp.ccode(result,"result_%i"%i))
将输出:
x0[0] = a[0];
x0[1] = a[1];
x0[2] = a[2];
x0[3] = a[3];
x0[4] = a[4];
x0[5] = a[5];
x0[6] = a[6];
x0[7] = a[7];
x0[8] = a[8];
x1 = x0[0];
x2 = x0[1];
x3 = x0[3];
x4 = x2*x3;
x5 = x0[2];
x6 = x0[6];
x7 = x5*x6;
x8 = x0[4];
x9 = x0[7];
x10 = x0[5];
x11 = x0[8];
x12 = x10*x9;
result_0[0] = pow(x1, 2) + x4 + x7;
result_0[1] = x1*x2 + x2*x8 + x5*x9;
result_0[2] = x1*x5 + x10*x2 + x11*x5;
result_0[3] = x1*x3 + x10*x6 + x3*x8;
result_0[4] = x12 + x4 + pow(x8, 2);
result_0[5] = x10*x11 + x10*x8 + x3*x5;
result_0[6] = x1*x6 + x11*x6 + x3*x9;
result_0[7] = x11*x9 + x2*x6 + x8*x9;
result_0[8] = pow(x11, 2) + x12 + x7;
此致

最佳答案

有一个函数叫 create_expand_pow_optimization在这方面创建一个包装器来优化您的表达式。它将用显式乘法代替的最高幂作为参数。
包装器返回 UnevaluatedExpr防止自动简化会恢复此更改。

import sympy as sp
from sympy.codegen.rewriting import create_expand_pow_optimization

expand_opt = create_expand_pow_optimization(3)

a = sp.Matrix(sp.MatrixSymbol('a',3,3))
res = sp.cse(a@a)

for i,result in enumerate(res[1]):
print(sp.ccode(expand_opt(result),"result_%i"%i))
最后,请注意,对于足够高的优化级别,您的编译器会处理这个问题(并且可能在这方面做得更好)。

关于python - 使用 Sympy 生成 C 代码。用 x*x 替换 Pow(x,2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65534432/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com