2016-05-29 4 views
1

私はMATLABのmexファイルとして書いています。この関数は、C++のハードウェアとインタフェースするため、MEXを使用する必要があります。設定できるオプションはたくさんありますが、containers.Mapを使用して渡したいと考えています。 (そうでなければ、膨大な数の関数パラメータが必要です)MATLABのmexファイルのマップから値を取得する方法はありますか?

キーを使用して値を取得するマップの演算子にアクセスする方法はありません。私はmexCallMATLABを使ってみましたが、私の様々なアプローチは失敗しました。これを行う方法はありますか?

すぎて、失敗するだろう私は多分地図subsrefを使用してこの作業を実施して思ったが、これはMATLABで失敗したので、私はMEXファイルに相当するものを推測している:

dict = containers.Map('foo', 3) 
subsref(dict, struct('type', '.', 'subs', 'foo')) 
+2

あなただけの構造体を使用することはできますか?次に、 'mxGetField'やその他の関連する関数を使うことができます。 – horchler

+0

多分 - 私は今それを見ています。 –

+0

はい - それは私のために働く。ありがとう!しかし、誰かがまだマップについての回答を求めているかもしれないので、私はこの質問を開いたままにしておきたいと思います。 –

答えて

0

アップルが正しい軌道に乗ってくれたための@ nirvana-msu。また、代わりにstructを使用することを提案するための@horchlerに感謝します。ここでfooという名前のフィールドを持つMATLABに1を加えた後、C++でcontainers.Mapにアクセスする方法は次のとおりです。

#include <mex.h> 

void mexFunction(int nlhs, mxArray *plhs[], 
       int nrhs, const mxArray *prhs[]) { 
    mxArray *args[2]; 
    args[0] = const_cast<mxArray*>(prhs[0]); 

    const char **fields = (const char **) mxCalloc(2, sizeof(*fields)); 
    fields[0] = "type"; 
    fields[1] = "subs"; 

    args[1] = mxCreateStructMatrix(1, 1, 2, fields); 
    auto typeStr = mxCreateString("()"); 
    mxSetField(args[1], 0, "type", typeStr); 
    auto mapKey = mxCreateString("foo"); 
    mxSetField(args[1], 0, "subs", mapKey); 

    mxArray *output; 
    mexCallMATLAB(1, &output, 2, args, "subsref"); 
    mexPrintf("%f\n", mxGetScalar(output)); 
    mxDestroyArray(args[1]); 
    mxFree(fields); 
} 
2

あなたは間違った'type'でを使用していますsubsref - 代わりに'()'を使用してください。これは、の表記をcontainers.Mapにしていて、構造体のようにドット表記を使用していないためです。次のメソッドが動作します。

dict = containers.Map('foo', 3); 
subsref(dict, struct('type', '()', 'subs', 'foo')) 

ans = 
    3 

側の注意点として、私はcontainers.Mapを使用することが最善の方法であれば、本当にわかりません。明示的なセッターメソッドを作成すると、C++コードがはるかにクリーンになります。プロパティが多すぎる場合はBuilder design patternが役に立ちます。

関連する問題