2017-02-13 68 views
0

我有一個類的實例,我想通過使用mexCallMATLAB函數將它傳遞給一個函數。如何在「mwArray *」和「mxArray *」之間傳輸數據?

該類最初是在Matlab中,但由於數據是在我的C++包裝,我使用這approach並打包我的數據。因此,最終對象的類型是mwArray(請參見提及的鏈接和GlobalData類,它是在Matlab中的,而globals是C++中的實例)。但是mexCallMATLAB功能使用mxArray *

如何將mwArray *的數據傳輸到mwArray *?如果類型很簡單,可以通過手動傳輸輕鬆完成。例如,創建一個雙數組mxArray並手動將數據複製到它。但在這種情況下,數據是一類多個數據字段/類型。

更一般的如何從C++包裝器傳遞一個類到Matlab函數?

想這是在Matlab

classdef GlobalData < handle 

    properties 
     val1 
     val2 
     val3 
    end 
end 

這是我通過mcc編譯和用於包裝類MATLAB函數的類。

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'。因此'B = A-> GetData();'必須改爲'A-> GetData(B,sizeof(A));'但是這段代碼'不能將參數1從'mxArray *'轉換爲'mxDouble *' ' –