4

この質問は、この質問で得た問題を解決した後に来ます。カメラからのフレームを処理し、処理されたフレームごとにマトリックスを生成する C++ コードがあります。各マトリックスをmatlabエンジンに送信したいので、実行の最後にすべてのマトリックスを保存しました。これを行う方法について混乱しています。各反復でマトリックスを送信しますが、常に上書きしているため、最後には1つしかありません。コード例を次に示します。

マトリックス.cpp

#include helper.h

mxArray *mat;   
mat = mxCreateDoubleMatrix(13, 13, mxREAL);     
memcpy(mxGetPr(mat),matrix.data, 13*13*sizeof(double));
engPutVariable(engine, "mat", mat);

また、カウンターを使用してさまざまな行列に動的に名前を付けようとしましたが、matlab エンジンでは変数を最初に定義する必要があるため、機能しませんでした。どんな助けでも大歓迎です。ありがとう。

4

3 に答える 3

5

次のように、matlab ワークスペースで cell 配列を作成できます。

    mwSize size = 10;
    mxArray* cell = mxCreateCellArray(1, &size);

    for(size_t i=0;i<10;i++)
    {
        mxArray *mat;   
        mat = mxCreateDoubleMatrix(13, 13, mxREAL);     
        memcpy(mxGetPr(mat),matrix.data, 13*13*sizeof(double));

        mwIndex subscript = i;
        int index = mxCalcSingleSubscript(cell , 1,&subscript); 
        mxSetCell(m_cell , index, mat);
   }

   engPutVariable(engine, "myCell", cell);
于 2012-01-13T12:37:53.340 に答える
4

フレーム数が事前にわからない場合は、C で mxArray を拡張しようとしないでください。便利ではありません。あなたはすでに開始に近づいていました。すべての問題は次の方法で解決できます。

engEvalString(engine, "your command here")

詳細はこちらをご覧ください

最も簡単なアプローチは次のようなものです。

engPutVariable(engine, "mat", mat);
engEvalString("frames{length(frames)+1} = mat;");

正確には行わないでください。これは説明であり、非常に遅くなります。1000 フレームを事前に割り当ててから、必要に応じてさらに 1000 (またはより適切な数) に拡張することをお勧めします。さらに良いのは、遅いセル配列を使用しないことです。代わりに、次のような 3D 配列を使用できます。

frames = zeros(13,13,1000);
frames(:,:,i) = mat;
i = i + 1;

繰り返しますが、ブロックに事前に割り当てます。あなたはアイデアを得る。本当に高速である必要がある場合は、C で 3D 配列を作成し、いっぱいになったら MATLAB に送信できます。

于 2012-01-13T15:02:07.283 に答える
3

多分あなたはvector<mxArray>stdlibから使うことができます。

于 2012-01-13T12:07:17.047 に答える