2017-02-13 19 views
0

私はクラスのインスタンスを持っており、それを関数mexCallMATLABを使って関数に渡したいと思います。"mwArray *"と "mxArray *"の間でデータを転送するにはどうすればよいですか?

クラスはもともとMatlabにありますが、データはC++ラッパーに入っているので、私はこのapproachを使用してデータをパックしました。したがって、最終オブジェクトのタイプはmwArray(見た目のリンクとMatlabにあるGlobalDataクラスとC++にあるglobalsインスタンスです)。しかし、mexCallMATLAB関数はmxArray *を使用します。

mwArray *からmwArray *にデータを転送するにはどうすればよいですか?タイプがシンプルであれば、手動で転送するのが簡単です。たとえば、mxArrayの倍精度配列を作成し、手動でデータをコピーします。しかし、この状況では、データは複数のデータフィールド/タイプのクラスです。

より一般的には、C++ラッパーからどのようにクラスをMatlab関数に渡すことができますか?

が、これはこれは私がmccを経由してコンパイルしてラップクラスに使用MATLAB関数であるMatlabの

classdef GlobalData < handle 

    properties 
     val1 
     val2 
     val3 
    end 
end 

内のクラスであると仮定します。

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'メソッドは2つの入力を受け取ります。 'buffer'と' size'です。したがって、このコードでは、引数1を 'mxArray *'から 'mxDouble *'に変換することはできません。この場合、 'B = A-> GetData(); 'はA-> GetData(B、sizeof(A)); ' –

関連する問題