每次迭代发送一个矩阵:Matlab“engine.h”c ++

时间:2012-01-13 07:59:23

标签: c++ iteration matlab-engine

这个问题是在我解决了question中遇到的问题之后出现的。我有一个c ++代码处理来自摄像机的帧并为每个处理过的帧生成一个矩阵。我想向matlab引擎发送每个矩阵,所以在执行结束时我已经存储了所有矩阵。 我对如何做到这一点感到困惑,我在每次迭代中发送一​​个矩阵,但它一直在覆盖它,所以最后我只有一个。这是一个代码示例:

matrix.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引擎需要首先定义变量。任何帮助将不胜感激。感谢。

3 个答案:

答案 0 :(得分:5)

您可以在matlab工作空间中创建一个像这样的单元格数组:

    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);

答案 1 :(得分:4)

如果您不知道先验帧数,请不要尝试在C中展开mxArray。这不方便。你已经接近开始了。您可以通过以下方式解决所有问题:

engEvalString(engine, "your command here")

了解更多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。

答案 2 :(得分:3)

也许您可以使用stdlib中的vector<mxArray>