Оборачивание 4-мерного std :: vector из std :: complex & lt; float & gt; с SWIG

У меня проблема с переносом 4-мерного std :: vector, содержащего значения std :: complex. Это в основном матрица с 2 степенями свободы, следовательно, 4-мерная. Поскольку размеры матрицы меняются в зависимости от них, мне показалось целесообразным использовать вложенные векторы (поправьте меня, если я ошибаюсь).

Таким образом, тип данных выглядит

std::vector<std::vector<std::vector< std::vector<gr_complex > > > > my4dimvec;

Чтобы сделать его доступным в python, я создал следующий файл .i:

/* -*- c++ -*- */

#define DRMRX_API

%include "gnuradio.i"           // the common stuff

%{
#include "drmrx_conf.h"#include "drmrx_params.h"%}

//load generated python docstrings
%include "drmrx_swig_doc.i"
namespace std {
%template()     vector< std::vector< std::vector< std::vector<int> > > >;
%template()     std::vector< std::vector< std::vector< std::vector< gr_complex > > > > ;
};

%include "drmrx_conf.h"%include "drmrx_params.h"

gr_complex — это определение типа std :: complex, созданное в gnuradio.i. Кстати, 4-мерный int-вектор работает просто отлично.

Я получаю ошибку компиляции

/home/felixwunsch/src/gr-drm/gr-drmrx/build/swig/drmrx_swigPYTHON_wrap.cxx: In instantiation of ‘const char* swig::type_name() [with Type = std::complex<float>]’:
/home/felixwunsch/src/gr-drm/gr-drmrx/build/swig/drmrx_swigPYTHON_wrap.cxx:3530:65:   required from ‘static swig_type_info* swig::traits_info<Type>::type_info() [with Type = std::complex<float>; swig_type_info = swig_type_info]’
/home/felixwunsch/src/gr-drm/gr-drmrx/build/swig/drmrx_swigPYTHON_wrap.cxx:3537:41:   required from ‘swig_type_info* swig::type_info() [with Type = std::complex<float>; swig_type_info = swig_type_info]’
/home/felixwunsch/src/gr-drm/gr-drmrx/build/swig/drmrx_swigPYTHON_wrap.cxx:3571:14:   required from ‘static PyObject* swig::traits_from_ptr<Type>::from(Type*, int) [with Type = std::complex<float>; PyObject = _object]’
/home/felixwunsch/src/gr-drm/gr-drmrx/build/swig/drmrx_swigPYTHON_wrap.cxx:3577:58:   required from ‘static PyObject* swig::traits_from<Type>::from(const Type&) [with Type = std::complex<float>; PyObject = _object]’
/home/felixwunsch/src/gr-drm/gr-drmrx/build/swig/drmrx_swigPYTHON_wrap.cxx:3596:39:   required from ‘PyObject* swig::from(const Type&) [with Type = std::complex<float>; PyObject = _object]’
/home/felixwunsch/src/gr-drm/gr-drmrx/build/swig/drmrx_swigPYTHON_wrap.cxx:4635:4:   [ skipping 7 instantiation contexts ]
/home/felixwunsch/src/gr-drm/gr-drmrx/build/swig/drmrx_swigPYTHON_wrap.cxx:4658:54:   required from ‘static PyObject* swig::traits_from<std::vector<T> >::from(const std::vector<T>&) [with T = std::vector<std::vector<std::complex<float> > >; PyObject = _object]’
/home/felixwunsch/src/gr-drm/gr-drmrx/build/swig/drmrx_swigPYTHON_wrap.cxx:3596:39:   required from ‘PyObject* swig::from(const Type&) [with Type = std::vector<std::vector<std::vector<std::complex<float> > > >; PyObject = _object]’
/home/felixwunsch/src/gr-drm/gr-drmrx/build/swig/drmrx_swigPYTHON_wrap.cxx:4635:4:   required from ‘static PyObject* swig::traits_from_stdseq<Seq, T>::from(const sequence&) [with Seq = std::vector<std::vector<std::vector<std::vector<std::complex<float> > > > >; T = std::vector<std::vector<std::vector<std::complex<float> > > >; PyObject = _object; swig::traits_from_stdseq<Seq, T>::sequence = std::vector<std::vector<std::vector<std::vector<std::complex<float> > > > >]’
/home/felixwunsch/src/gr-drm/gr-drmrx/build/swig/drmrx_swigPYTHON_wrap.cxx:4658:54:   required from ‘static PyObject* swig::traits_from<std::vector<T> >::from(const std::vector<T>&) [with T = std::vector<std::vector<std::vector<std::complex<float> > > >; PyObject = _object]’
/home/felixwunsch/src/gr-drm/gr-drmrx/build/swig/drmrx_swigPYTHON_wrap.cxx:3596:39:   required from ‘PyObject* swig::from(const Type&) [with Type = std::vector<std::vector<std::vector<std::vector<std::complex<float> > > > >; PyObject = _object]’
/home/felixwunsch/src/gr-drm/gr-drmrx/build/swig/drmrx_swigPYTHON_wrap.cxx:6680:894:   required from here
/home/felixwunsch/src/gr-drm/gr-drmrx/build/swig/drmrx_swigPYTHON_wrap.cxx:3520:77: error: ‘type_name’ is not a member of ‘swig::traits<std::complex<float> >’
make[2]: *** [swig/CMakeFiles/_drmrx_swig.dir/drmrx_swigPYTHON_wrap.cxx.o] Error 1
make[1]: *** [swig/CMakeFiles/_drmrx_swig.dir/all] Error 2
make: *** [all] Error 2

Есть идеи, в чем может быть проблема?

Спасибо,
Феликс

2

Решение

Хорошо, я как-то решил это сам. Решением было не только определить 4-мерный вектор, но также 1-2-и-3-мерные векторы. Окончательная часть шаблона теперь выглядит как

namespace std {
%template()     vector< std::vector< std::vector< std::vector<int> > > >;
%template()     std::vector< std::vector< std::vector< gr_complex > > >;
%template()     std::vector< std::vector< std::vector< std::vector< gr_complex > > > >;
};

1- и 2-мерные версии были объявлены ранее в файле gnuradio.i, поэтому я не перечислял их здесь.

1

Другие решения

Других решений пока нет …