2016-09-01 5 views
0

対応する要点はhereです。Eigen3 :: Vector3dおよびstd :: vectorを持つSWIG <Vector3d>


SWIGを使用して、PythonからC++の関数を呼び出すことができます。特に、ベクトルを受け入れる関数です。これまでのところ、私はstd_vector.istd::vector<double>ですべてを実装しましたが、私はそれをすべてEigen::Vector3dに変換して終了してしまいました。小さなC++の例では、私は最高のPythonからこれを呼び出す方法いえ見当がつかない

#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 

です。おそらく、

import mytest 

a = [1, 1, 0] 
mytest.print_norm(a) 

これは合理的ですか? numpy.arrayも動作する可能性があります。いずれにせよ、私はmytest.iに何を入れるべきか分かりません。

ヒント

答えて

1

Web上にNumPyが浮かんでいるEigen型をラップする例がいくつかありますが、Biomechanical Toolkitの実装が最も広くコピーされています。その1つを使用することもお勧めします。それは比較的大きく見えますが、それは主にすべての健全性チェックと、異なるタイプの別々のテンプレートです。 numpyのより固有の

変換は、データが単に固有の各係数に割り当てされた連続C(++)配列としてデータを取得するためにPyArray_DATA続いて、添付numpy.iからobj_to_array_contiguous_allow_conversion関数を使用して動作しますマトリックスを別々に使用する。

他の方法は逆です:PythonのNumPy配列は、で作成されます。これは固有行列からのデータで満たされています。

std::vector<Eigen::Vector3d>のラッピングを直接実行するわけではありませんが、おそらく%include <stl.i>を使用して設定することができますが、私の経験上、Eigenの問題のため3DベクトルのリストとしてNx3 numpy配列を使用する方が良いでしょう。アライメントとSTLコンテナ。

関連する問題