2014-10-09 12 views
6

Ich bin auf einem C-Programm arbeiten, das immer wieder eine große Matlab Datenstruktur benötigt zuzugreifen. Dies ist ein grafikintensives Programm, das OpenGL verwendet, also muss es schnell sein.C Zeiger auf Matlab Variablen

Der wiederholte Zugriff auf diese Datenstruktur mit Matlab Engine scheint zu lang zu dauern (~ 10-20 ms für jeden Aufruf von engGetVariable und engPutVariable). Ich denke, das liegt daran, dass diese Funktionen die Daten im Speicher kopieren.

Statt also engGetVariable auf der Datenstruktur selbst, nun einen Zeiger auf die Datenstruktur zu erhalten, ich versuche. Wenn ich auf dem Zeiger engGetVariable aufruft, könnte ich auf die Datenstruktur in C zugreifen, indem ich den Zeiger dereferenziere, ohne die Daten zuerst in den Speicher kopieren zu müssen. Bisher konnte ich das jedoch noch nicht schaffen. Ist so etwas möglich?

// Make vars in matlab workspace 
engEvalString(ep, "a=9"); 
engEvalString(ep, "ap=getPointer(a)"); 

// Get variables in C 
ap = engGetVariable(ep, "ap"); 
a = *mxGetPr(ap); 

printf("a = %f", a); 
+0

was gut ist die 'ap' Variable tun? Warum nicht einfach das 'mxArray', das einem' a' entspricht, aufrufen und 'mxGetPr' so oft wie gewünscht aufrufen? –

+0

Was ist die Ausgabe, die Sie sehen? – AnonSubmitter85

+0

Die 'a' Datenstruktur könnte in Matlab zwischen den Zeiten geändert werden, dass der Motor auf sie zugreift. Wenn "a" geändert wird, wird es scheinbar an einen anderen Speicherort kopiert, so dass 'mxGetPr' nicht auf die aktualisierte Kopie zeigt. –

Antwort

3

MATLAB engine arbeitet im Hintergrund als separaten Prozess aus Ihrem Programm von ausgeführt wird, und verfügt über einen eigenen Adressraum. Daher Zeiger auf Daten im Speicher eines anderen Prozesses indiskutabel ist, und die einzige Möglichkeit ist, in Verbindung steht, eine Art IPC Mechanismus.

Unter Windows wird die Engine API auf COM Schnittstellen basieren, während auf UNIX-Systemen der Motor auf pipes (es kann sogar laufen gegen Remote-Rechner mit Hilfe von rsh) basiert.

So ist die einzige Option, die Sie haben, ist die freiliegenden Funktionen engGetVariable und engPutVariable zum Austausch von Daten zu verwenden: Sie eine Kopie einer Variablen aus dem Arbeitsbereich MATLAB erhalten engGetVariable verwenden, erhalten Sie das Array der zugrunde liegenden mxArray Datenzeiger mit mxGetData und manipulieren Wenn Sie möchten, senden Sie die aktualisierte Kopie unter Verwendung von engPutVariable an MATLAB zurück.

+1

Betrachten Sie die MATLAB-Engine als eine Abstraktion eines Client/Server-Modells; Sie können sicherlich nicht direkt auf die Daten des entfernten Objekts auf dem Server zugreifen, Sie können dies nur über die exponierte Schnittstelle und API von der Client-Seite aus tun. – Amro