SWIG:如何将复数向量从C ++传递给python

问题描述 投票:1回答:1

我需要将一个复杂数字列表从python传递给C ++来初始化一个向量,经过一些操作后,我需要将复数double的向量传递给python。

这是我的尝试:

example.i

%module example

%{
#define SWIG_FILE_WITH_INIT
#include "example.h"
%}

%include "std_vector.i"
%include <complex.i>
%include <std_complex.i>
namespace std {
    %template(DoubleVector)  vector<double>;
    %template(ComplexVector) vector<std::complex<double> >;
}
%include "example.h"

example.cpp

#include "example.h"


void my_class::set_value(Complex a, std::vector<Complex> v)
{
    com1 = {1,2};
    comV = v;
}

void my_class::print_value()
{
    std::cout << com1<< std::endl;
    for (int i=0; i<comV.size(); i++)
        std::cout<<comV[i]<<std::endl;
}

example.h

#include <iostream>
#include <cstdio>
#include <vector>
#include <omp.h>
#include <complex>

typedef std::complex<double> Complex;

class my_class 
{
    private:    
        Complex com1;
        std::vector<Complex> comV;
    public:
        my_class(){ }
        void set_value(Complex a, std::vector<Complex> v);
        void print_value();
};

我编译并在尝试测试时给出以下错误:

import example
c = example.my_class()
c.set_value(complex(1.0,3.5), [complex(1,1.2), complex(2.0,4.2)])
c.print_value()

return _example.my_class_set_value(self, a, v)
TypeError: in method 'my_class_set_value', argument 3 of type 'std::vector< Complex,std::allocator< Complex > >'

我不知道我在哪里弄错了?

python c++ vector swig
1个回答
1
投票

你必须在SWIG文件中放置一个ComplexVector的显式实例,否则它将无法工作。你的错误是你没有正确地限定std::complex<double>(你忘记了命名空间)。

%module example

%{
#include "example.h"
%}

%include "std_vector.i"
%include "std_complex.i"
namespace std {
    %template(DoubleVector)  vector<double>;
    %template(ComplexVector) vector<std::complex<double>>;
}
%include "example.h"

此外,qazxsw poi错过了一份返回声明,这将导致非法指令。

© www.soinside.com 2019 - 2024. All rights reserved.