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

Posted

技术标签:

【中文标题】SWIG:如何将复数向量从 C++ 传递到 python【英文标题】:SWIG: How to pass a vector of complex numbers from C++ to python 【发布时间】:2017-12-23 05:07:24 【问题描述】:

我需要将一个复数列表从 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 > >'

不知道是哪里出错了?

【问题讨论】:

【参考方案1】:

您必须将ComplexVector 的显式实例化放在 SWIG 文件中,否则它将不起作用。您的错误是您没有正确限定std::complex&lt;double&gt;(您忘记了命名空间)。

%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() 缺少将导致非法指令的返回语句。

【讨论】:

以上是关于SWIG:如何将复数向量从 C++ 传递到 python的主要内容,如果未能解决你的问题,请参考以下文章

SWIG:如何将 C++ 对象数组从 C# 传递到 C++?

如何使用 swig 将 const 字符串参数从 perl 传递到 c++

将字符串 (const char*) 从 C++ 传递到 C# 时,SWIG_csharp_string_callback 会导致内存泄漏

使用 SWIG 时如何将 int 数组和 List<string> 作为参数从 C# 传递给 C++

使用 swig 类型映射从 c++ 方法返回向量<pair<int,int>> & 到 python 元组列表

如何在 SWIG 中将向量的锯齿状 C++ 向量转换(类型映射)为 Python