微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用C(和GSL)扩展和嵌入Python(和NumPy):将gsl_matrix传递给python并返回

我的问题“应该”很简单,但我仍然无法解决它.

我目前正在开发一个项目,需要一些繁重的计算(在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;
  }
%}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐