簡體   English   中英

使用C ++(和GSL)擴展和嵌入Python(和NumPy):將gsl_matrix傳遞給python並返回

[英]Extend and Embed Python (and NumPy) with C++ (and GSL): pass gsl_matrix to python and back

我的問題“應該”很簡單,但我仍然無法解決它。

我目前正在開發一個項目,需要一些繁重的計算(在C ++中完成)和一些模擬后的數據分析(在Python中完成)。

但是,現在我正在改變主算法,我需要從C ++和Python中“循環”一些計算來回。 也就是說,我需要在C ++和Python中來回移動雙打矩陣。

在C ++中,數據矩陣是“gsl_matrix”對象,而在python中,相同的矩陣被實現為“numpy數組”。

目前,我正在運行我的C ++代碼,將矩陣保存到文件,從python中讀取它,將其寫回文件,然后在C ++中再次打開它以進行進一步的計算。

由於這是非常低效的,我想問一下是否有人可以給我一個如何以“干凈”的方式做到這一點的例子。

我一直在閱讀(並嘗試了10天)SWIG,Cython,Boost.Python和Boost.Numpy但我仍然無法破解它。

有沒有人有一個有效的例子來分享?

謝謝!

劉若英

我認為你不需要自己實現包裝器,因為你可以使用pygsl 如果你真的想要實現自己的版本,那么pygsl的例程就是值得的

%{
#include <gsl/gsl_matrix_double.h>
#include <gsl/gsl_matrix_complex_double.h>
%}

%include typemaps.i

// gsl_matrix typemaps
%typemap(in) gsl_matrix* %{
  PyArrayObject *_PyMatrix$argnum;
  gsl_matrix_view matrix$argnum;
  {
    _PyMatrix$argnum = (PyArrayObject*)
      PyArray_ContiguousFromObject($input, PyArray_DOUBLE, 2, 2);
    if (_PyMatrix$argnum == NULL)
      return NULL;
    matrix$argnum
      = gsl_matrix_view_array((double*)_PyMatrix$argnum->data,
                  _PyMatrix$argnum->dimensions[0],
                  _PyMatrix$argnum->dimensions[1]);    
    $1 = &matrix$argnum.matrix;
  }
%}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM