python - 带有 Eigen3::Vector3d 和 std::vector<Vector3d> 的 SWIG

标签 python c++ swig eigen eigen3

对应的要点是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/

相关文章:

python - 需要帮助将ibkr API限制为50msg/min

C++ 碰撞检测在最后一次检查时不起作用?

c++ - double 整数和超长整数之间的精度差异是多少?

python - 如何让我的 SWIG 扩展模块与 Pickle 一起工作?

c - 我怎样才能让 swig 包装一个链表类型的结构?

python - 有没有办法通过 Airflow API 创建/修改连接

python - python中的UDP广播和自动服务器发现,TCP套接字不可用

python - 使用提供给构造函数的数据列表在数据帧构造函数中设置多索引

c++ - 可以使用 C++ 构建 Winforms 应用程序吗?

c++ - 在带有 Visual Studio 的 Windows 上使用 swig -go