Экспорт вектор-функции из Python в C с помощью sympy - PullRequest
0 голосов
/ 15 октября 2018

В настоящее время я пытаюсь переместить некоторые из моих алгоритмов из Mathematica в sympy.В этом контексте я пытаюсь найти генератор c-кода в соответствии с пакетами mathematica:

, которые позволяют экспортировать символьные выражения в эффективный C-код, включая функции с векторным значением.Я искал в документации Sympy, но кажется, что codegen работает только со скалярными функциями.Мне нужен способ экспорта векторнозначных функций с вычислительной эффективностью в C.

Пример: Предположим, у меня есть 2-мерные векторы x и y и я хочу создать функцию, которая возвращает 2-мерный вектор:

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;
}
...