相应的要点是here。
我想使用SWIG从Python调用一堆C ++函数,特别是接受向量的函数。到目前为止,我已经使用std_vector.i
和std::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
中放什么。
任何提示?
答案 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容器的问题。