C++ Lib Eigen mit SWIG auf Python-Typen mappen

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
sabi
User
Beiträge: 1
Registriert: Dienstag 8. Februar 2011, 23:00

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:

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"
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:

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;
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:

Code: Alles auswählen

<swig Object of type 'VectorXd *' at 0x.......>
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:

Code: Alles auswählen

AttributeError: 'PySwigObject' object has no attribute .......
Kann mir vielleicht jemand erklären, was ich falsch mache, und wie das richtig funktioniert? :cry:

Danke,
s.
scoder
User
Beiträge: 13
Registriert: Freitag 4. Februar 2011, 19:04

Ich habe schon von einigen Leuten gehört, dass sie Wrapper für Eigen geschrieben haben. Allerdings wirst du mit SWIG hier wahrscheinlich nicht glücklich werden, schon allein aus Performancegründen.

Hier ist ein Wrapper in Cython:

http://groups.google.com/group/cython-u ... 5ff5055eff

und hier einer in C++:

http://www.brainfold.org/blog/tag/python/

Stefan
Antworten