SWIG与Eigen3 :: Vector3d和std :: vector <vector3d>

时间:2016-09-01 21:55:08

标签: python c++ swig eigen eigen3

相应的要点是here

我想使用SWIG从Python调用一堆C ++函数,特别是接受向量的函数。到目前为止,我已经使用std_vector.istd::vector<double>实现了所有功能,但是由于我最终将它全部转换为Eigen::Vector3d,我认为我可能会更好地将其设为原生。一个小的C ++示例是

#ifndef MYTEST_HPP
#define MYTEST_HPP

#include <iostream>
#include <Eigen/Dense>

void
print_norm(const Eigen::Vector3d & x) {
  std::cout << x.norm() << std::endl;
}

void
print_norms(const std::vector<Eigen::Vector3d> & xs) {
  for (const auto & x: xs) {
      std::cout << x.norm() << std::endl;
  }
}

#endif // MYTEST_HPP

我不知道如何从Python中最好地调用它。也许

import mytest

a = [1, 1, 0]
mytest.print_norm(a)
这是合理的吗? numpy.array也可能有效。无论哪种方式,我都不知道在我的mytest.i中放什么。

任何提示?

1 个答案:

答案 0 :(得分:1)

有一些包含Eigen类型的例子,其中NumPy在网络上漂浮,其中Biomechanical Toolkit实现是最广泛复制的,我也建议使用它。它看起来相对较大,但主要来自所有的理智检查和不同类型的单独模板。

从NumPy到Eigen的转换通过使用随附的numpy.i中的obj_to_array_contiguous_allow_conversion函数,然后是PyArray_DATA来获取数据作为连续的C(++)数组,从中数据被简单地分配给特征矩阵中的每个系数。

另一种方式几乎是相反的:用PyArray_SimpleNew创建一个python NumPy数组,其中填充了来自Eigen矩阵的数据。

它没有直接对std::vector<Eigen::Vector3d>进行包装,您可以使用%include <stl.i>进行设置,但根据我的经验,最好使用Nx3 numpy数组作为3D列表向量,因为Eigen,对齐和STL容器的问题。