SWIG:如何将复数向量从 C++ 传递到 python
SWIG: How to pass a vector of complex numbers from C++ to python
我需要将复数列表从 python 传递给 C++ 以初始化一个向量,在一些操作之后,我需要将复数双精度向量传递回 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 > >'
我不知道我哪里弄错了?
您必须在 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"
此外 my_class::print_value()
缺少 return 语句,这将导致非法指令。
我需要将复数列表从 python 传递给 C++ 以初始化一个向量,在一些操作之后,我需要将复数双精度向量传递回 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 > >'
我不知道我哪里弄错了?
您必须在 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"
此外 my_class::print_value()
缺少 return 语句,这将导致非法指令。