【问题标题】:Sending a matrix with each iteration: Matlab "engine.h" c++每次迭代发送一个矩阵:Matlab "engine.h" c++
【发布时间】:2012-01-13 07:59:22
【问题描述】:

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

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

【问题讨论】:

  • 在matlab中当然可以,我不知道如何使用mex函数在c++中定义它。我试图创建像 mat[i] 或 mat(i) 这样的变量,但 matlab 引擎不将 i 理解为整数。您只能对 mxArray 变量执行 engPutVariable。

标签: c++ iteration matlab-engine


【解决方案1】:

您可以像这样在 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);

【讨论】:

  • 所以我必须将 al 矩阵存储在元胞数组中,直到程序结束,然后将其发送到 matlab 引擎。我不知道先验的迭代次数,有必要吗?
  • 1.) 在您的问题中,您说您确实希望在最后拥有引擎工作区中的所有矩阵,那么它有什么问题? 2.)据我所知,您需要先验地知道单元大小。您可以创建一个固定大小的单元格,如果已填满则开始一个新单元格。
  • 另一种可能性是 engPutVariable(engine, stringConcat("mat",i), mat); (你必须自己构建 stringConcat ......)
【解决方案2】:

如果你不知道先验的帧数,不要尝试在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。

【讨论】:

  • 好的,但是如何将变量frames(即int)放入只接受mxArray的matlab引擎中。这是我尝试时遇到的编译错误。
  • 没关系,我终于成功了。那是变量帧没有被初始化。谢谢
【解决方案3】:

也许您可以使用 stdlib 中的vector&lt;mxArray&gt;

【讨论】:

  • 它必须是向量,但您仍然必须将它们全部发送到 matlab。
猜你喜欢
  • 2013-03-04
  • 1970-01-01
  • 2014-03-13
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 2014-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多