对应的要点是here .
我想使用 SWIG 从 Python 调用一堆 C++ 函数,特别是接受 vector 的函数。到目前为止,我已经用 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
中放什么.
有什么提示吗?
最佳答案
网络上流传着一些使用 NumPy 包装 Eigen 类型的示例,其中 Biomechanical Toolkit implementation 是最广泛复制的,我也建议使用那个。它看起来相对较大,但这主要来自所有完整性检查和不同类型的单独模板。
从 NumPy 到 Eigen 的转换使用 obj_to_array_contiguous_allow_conversion
来自随附的 numpy.i
的功能, 其次是 PyArray_DATA
获取作为连续 C(++) 数组的数据,从中将数据简单地分别分配给特征矩阵中的每个系数。
另一种方式几乎是相反的:python NumPy 数组是用 PyArray_SimpleNew
创建的,其中填充了来自特征矩阵的数据。
它不直接对 std::vector<Eigen::Vector3d>
进行包装,您可以使用 %include <stl.i>
进行设置可能,但根据我的经验,由于 Eigen、对齐和 STL 容器的问题,最好使用 Nx3 numpy 数组作为 3D vector 列表。
关于python - 带有 Eigen3::Vector3d 和 std::vector<Vector3d> 的 SWIG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39281461/