C++ Lib Eigen mit SWIG auf Python-Typen mappen
Verfasst: Dienstag 8. Februar 2011, 23:14
Hallo,
ich verwende SWIG zum ersten Mal, und finde leider nur wenig hilfreiche Informationen dazu
Ich habe deshalb eine Frage zur Benutzung von SWIG, um C++ Code in Python-Code zu wrappen. Ich verwende in C++ auch die Lib Eigen (tuxfamily), und möchte Objekte dieser Typen (VectorXd, MatrixXd..) als Parameter und Rückgabewerte meiner Methoden verwenden. In Python sollten sie auf numpy (oder andere) Python-Typen gemappt werden.
Mein SWIG-Input ist momentan der:
Um die Typen der Lib Eigen mappen zu können, habe ich typemaps.i und typedefs.h Dateien verwendet (von http://listengine.tuxfamily.org/lists.t ... 00031.html). Die typedefs.h schaut bei mir so aus:
Das Kompilieren, Swig-Wrappen und Linken funktioniert ohne Fehler, aber beim Testen hab ich dann ein Problem:
Wenn ich einen Rückgabewert z.b. vom Typ VectorXd in Python ausgeben möchte, dann krieg ich als Output:
Aber so ein Objekt kann ich nicht in Python nicht verwenden - oder zumindest weiß ich nicht wie... Wenn ich irgend eine Funktion auf diesem Objekt aufrufe, krieg ich die Fehlermeldung:
Kann mir vielleicht jemand erklären, was ich falsch mache, und wie das richtig funktioniert?
Danke,
s.
ich verwende SWIG zum ersten Mal, und finde leider nur wenig hilfreiche Informationen dazu

Ich habe deshalb eine Frage zur Benutzung von SWIG, um C++ Code in Python-Code zu wrappen. Ich verwende in C++ auch die Lib Eigen (tuxfamily), und möchte Objekte dieser Typen (VectorXd, MatrixXd..) als Parameter und Rückgabewerte meiner Methoden verwenden. In Python sollten sie auf numpy (oder andere) Python-Typen gemappt werden.
Mein SWIG-Input ist momentan der:
Code: Alles auswählen
%module myModule
%{
#include "MyClass.h"
%}
%{
#define PY_ARRAY_UNIQUE_SYMBOL SOME_LIBRARY_NAME
#include "numpy/arrayobject.h"
#include "typedefs.h"
%}
%init
%{
import_array();
%}
%include "typemaps.i"
%include "MyClass.h"
Code: Alles auswählen
#define EIGEN_MATRIXBASE_PLUGIN "MatrixBaseAddons.h"
#include <Eigen/Core>
#include <cmath>
typedef double Real;
typedef Eigen::Matrix< Real, Eigen::Dynamic, 1 > ColXR;
typedef Eigen::Matrix< Real, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor, Eigen::Dynamic, Eigen::Dynamic > MatrixXRscipy;
Wenn ich einen Rückgabewert z.b. vom Typ VectorXd in Python ausgeben möchte, dann krieg ich als Output:
Code: Alles auswählen
<swig Object of type 'VectorXd *' at 0x.......>
Code: Alles auswählen
AttributeError: 'PySwigObject' object has no attribute .......

Danke,
s.