2014-10-09 3 views
6

큰 MATLAB 데이터 구조에 반복적으로 액세스해야하는 C 프로그램에서 작업하고 있습니다. 이것은 OpenGL을 사용하는 그래픽 집약적 인 프로그램이므로 빠르지 않아야합니다.C 포인터를 Matlab 변수

Matlab Engine을 사용하여이 데이터 구조에 반복적으로 액세스하는 데 너무 오래 걸리는 것처럼 보입니다 (engGetVariable 및 engPutVariable을 호출 할 때마다 ~ 10-20ms). 나는이 함수들이 메모리에있는 데이터를 복사하기 때문이라고 생각한다.

따라서 데이터 구조 자체에 engGetVariable을 사용하는 대신 데이터 구조에 대한 포인터를 얻으려고합니다. 포인터에 engGetVariable을 호출하면 포인터를 역 참조하여 데이터를 메모리에 먼저 복사하지 않고 C의 데이터 구조에 액세스 할 수 있습니다. 그러나 나는이 일을 지금까지 할 수 없었습니다. 이게 가능한가?

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

'ap' 변수가 무슨 소용이 있습니까? 왜 그냥'a'에 해당하는'mxArray'를 얻고,'mxGetPr'을 원하는만큼 여러 번 호출할까요? –

+0

보고있는 출력은 무엇입니까? – AnonSubmitter85

+0

'a' 자료 구조는 엔진이 접근하는 시간 사이에 Matlab에서 수정할 수 있습니다. 'a'가 수정되면 다른 메모리 위치에 복사 된 것처럼 보이므로'mxGetPr'은 업데이트 된 복사본을 가리 키지 않습니다. –

답변

3

MATLAB engine은 프로그램에서 별도의 프로세스로 백그라운드에서 실행하여 운영하고 있으며 자신의 주소 공간이 마련되어 있습니다. 따라서 다른 프로세스의 메모리에있는 데이터에 대한 포인터는 문제가되지 않으며 유일한 옵션은 IPC 메커니즘을 사용하여 통신하는 것입니다.

엔진에서 엔진 API는 COM 인터페이스를 기반으로하며 UNIX 시스템에서는 엔진이 pipes (rsh의 도움으로 원격 시스템에서도 실행 가능)을 기반으로합니다.

그래서 당신이 가지고있는 유일한 옵션은 engGetVariableengPutVariable 데이터 교환에 노출 기능을 사용하는 것입니다 : 당신은 engGetVariable를 사용하여 MATLAB 작업 공간에서 변수의 사본을 얻을, 당신은 mxGetDatamxArray 데이터 포인터를 기본 및 배열을 조작받을 원하는대로 업데이트 된 사본을 engPutVariable을 사용하여 MATLAB에 다시 보냅니다.

+1

은 MATLAB 엔진을 클라이언트/서버 모델의 추상화로 생각합니다. 당신은 분명히 서버상의 원격 객체의 데이터에 직접 접근 할 수 없다. 클라이언트 측의 노출 된 인터페이스와 API를 통해서만 가능하다. – Amro