使用sympy将向量值函数从python导出到C

时间:2018-10-15 14:27:51

标签: python c vector sympy codegen

我目前正在尝试将我的一些算法从Mathematica转移到sympy。在这种情况下,我试图找到一种与mathematica软件包相对应的c代码生成器:

允许将符号表达式导出为有效的C代码, 包括矢量值功能。 我一直在搜索sympy文档,但似乎 该codegen仅适用于标量函数。 我需要的是一种将计算有效的向量值函数导出到C的方法。

示例: 假设我有二维向量x和y,并且想要创建一个将二维向量返回的函数:

out=[(x(0)+y(0))^2,x(0)+y(0)+y(1)]  //MATLAB convention

应将其导出为如下所示的C函数:

void c_func (double* out, double *x, double *y){
  tmp1=x[0]+y[0];
  out[0]=tmp1*tmp1; //(x[0]+y[0])^2
  out[1]=tmp1+y[1]; //x[0]+y[0]+y[1]
}

但是,到目前为止,我只能导出标量函数。因此,我遇到了以下问题:

  1. 如何将向量用作函数参数
  2. 如何使用向量作为返回参数
  3. 如何最佳地重用数学运算(例如,创建临时变量tmp1 =(x + 1)并重用于out [0]和out [1]),如果依次导出每个向量元素,则无法实现

您知道吗,这是如何在sympy中实现的 还是您有其他替代解决方案? 在此先感谢!!!!

当前用于标量表达式导出的代码:

from sympy import*
from sympy.utilities.codegen import codegen

x1,x2 =   symbols('x1 x2')
x=Matrix([x1,x2])
y1,y2 =   symbols('y1 y2')
y=Matrix([y1,y2])

[(c_name, c_code), (h_name, c_header)] = codegen(("f", (x1+y2)**2), "C","myheader")
print(c_code)
[(c_name, c_code), (h_name, c_header)] = codegen(("f", (x1+y1+y2)), "C","")
print(c_code)

给出输出:

******************************************************************************/
#include "myheader.h"
#include <math.h>

double f(double x1, double y2) {
   return pow(x1 + y2, 2);
}

******************************************************************************/
#include ".h"
#include <math.h>

double f(double x1, double y1, double y2) {
   return x1 + y1 + y2;
}

0 个答案:

没有答案