2017-02-13 7 views
0

클래스의 인스턴스가 있고 mexCallMATLAB 함수를 사용하여 함수에 전달하려고합니다."mwArray *"와 "mxArray *"간에 데이터를 전송하는 방법은 무엇입니까?

클래스는 원래 Matlab에 있지만 데이터는 C++ 래퍼에 있으므로이 코드를 approach으로 사용하고 데이터를 패키지화했습니다. 그러므로 최종 오브젝트의 타입은 mwArray입니다. (Matlab에있는 GlobalData 클래스와 C++에있는 globals 인스턴스입니다.) 그러나 mexCallMATLAB 함수는 mxArray *을 사용합니다.

mwArray *에서 mwArray *까지 데이터를 전송하는 방법은 무엇입니까? 유형이 단순하다면 수동 전송으로 쉽게 할 수 있습니다. 예를 들어 mxArray의 이중 배열을 만들고 수동으로 데이터를 복사합니다. 그러나이 상황에서 데이터는 여러 데이터 필드/유형의 클래스입니다.

더 일반적으로 C++ 래퍼의 클래스를 Matlab 함수에 전달하는 방법은 무엇입니까?

는이 matlab에

classdef GlobalData < handle 

    properties 
     val1 
     val2 
     val3 
    end 
end 

이 내가 mcc를 통해 컴파일 및 포장 클래스에 사용되는 매트랩 함수의 클래스입니다 가정하자.

function globals = create_globals() 

    globals = GlobalData(); 
    globals.val1 = 2; 
    globals.val2 = 5.25; 
    globals.val3 = 'data name'; 
end 

이것은 데이터가있는 C++ 코드입니다. 여기에서 이전 방법을 사용하여 GlobalData의 인스턴스를 만들고 Matlab 함수 myCallback에 전달합니다.

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { 
    // ... 
    mwArray globals; 
     try { 

      // Pack data to a single Container class of type GlobalData 
      create_globals(1, globals); 

     } catch (const mwException& e) { 
      cerr << e.what() << endl; 
      return; 
     } catch (...) { 
      cerr << "Unexpected error thrown" << endl; 
      return; 
     } 

     int nlhs1 = 1, nrhs1 = 2; 
     mxArray *plhs1[1], *prhs1[2]; 

     // First parameter of myCallback set to a arbitrary double value 
     prhs1[0] = mxCreateDoubleMatrix(1, 1, mxREAL); 
     *mxGetPr(prhs1[0]) = .6; 

     // Here prhs1[1] must set to globals 
     // ??? prhs1[1] = globals ??? 

     mexCallMATLAB(nlhs1, plhs1, nrhs1, prhs1, "myCallback"); 
    // ... 
} 
+2

코드를 보여주십시오. 나는 초능력이 아니다. –

+0

이것은 오타입니까? "mwArray *를 mwArray *로 변환하는 방법은?"? –

+0

@RichardCritten mwArray 유형이'int' 또는'double'과 같은 간단한 데이터 유형이 아닌 클래스 일 때 어떻게 mwArray를 mxArray에 복사 할 수 있는지 의미합니다. –

답변

0

당신은 GetData() 방법을 사용하여 mxArray *을 추출 할 수 있습니다.

mwArray *A; 
    mxArray *B; 

    B = A->GetData(); 
+0

'GetData' 메소드는 두 개의 입력을받습니다. 'buffer'와'size'가 있습니다. 따라서이 코드에서는 '1 -> GetData (B, sizeof (A));'로 변경해야합니다. '이 코드에서는'1을 'mxArray *'에서 'mxDouble *'로 변환 할 수 없습니다. ' –