2014-10-09 9 views
6

Pracuję nad programem C, który musi wielokrotnie uzyskiwać dostęp do dużej struktury danych Matlab. Jest to intensywny program graficzny wykorzystujący OpenGL, więc musi być szybki.C wskaźniki do zmiennych Matlab

Wielokrotny dostęp do tej struktury danych za pomocą Matlab Engine wydaje się trwać zbyt długo (~ 10-20 ms dla każdego wywołania engGetVariable i engPutVariable). Myślę, że dzieje się tak, ponieważ te funkcje kopiują dane w pamięci.

W ten sposób zamiast używać metody engGetVariable w samej strukturze danych, teraz próbuję uzyskać wskaźnik do struktury danych. Jeśli wywołasz engGetVariable na wskaźniku, mógłbym uzyskać dostęp do struktury danych w C przez odwołanie do wskaźnika, bez konieczności wcześniejszego kopiowania danych do pamięci. Jednak do tej pory nie udało mi się tego sprawić. Czy coś takiego jest możliwe?

// 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

Co dobrego robi zmienna 'ap'? Dlaczego po prostu nie dostaniesz 'mxArray' odpowiadającego" a ", i wywołasz' mxGetPr' tyle razy ile chcesz? –

+0

Jakie wyniki widzisz? – AnonSubmitter85

+0

Struktura danych "a" może być modyfikowana w programie Matlab w czasie, gdy silnik uzyskuje do niej dostęp. Kiedy 'a' jest zmodyfikowane, wydaje się, że jest kopiowane do innej lokalizacji w pamięci, więc' mxGetPr' nie wskazuje zaktualizowanej kopii. –

Odpowiedz

3

MATLAB engine działa poprzez uruchomienie w tle jako osobny proces z programu, i ma swoją własną przestrzeń adresową. Dlatego wskaźniki do danych w pamięci innego procesu nie wchodzą w rachubę, a jedyną opcją jest komunikowanie się przy użyciu jakiegoś mechanizmu o nazwie IPC.

W Windows API silnika opiera się na COM interfejsów, natomiast w systemach UNIX silnik jest oparty na pipes (nawet może działać przeciwko zdalnych za pomocą rsh).

Więc jedyna opcja masz jest użycie odsłonięte funkcje engGetVariable i engPutVariable do wymiany danych: uzyskać kopię zmiennej z obszaru roboczego MATLAB użyciu engGetVariable, masz bazowego mxArray wskaźnik danych z mxGetData i manipulować tablicę jeśli chcesz, wyślij zaktualizowaną kopię do MATLAB, używając engPutVariable.

+1

myśleć o silniku MATLAB jako abstrakcji modelu klient/serwer; na pewno nie można uzyskać bezpośredniego dostępu do danych obiektu zdalnego na serwerze, można to zrobić tylko za pomocą odsłoniętego interfejsu i interfejsu API po stronie klienta. – Amro