【问题标题】:Returning N vectors of type int from C++ to matlab via mexfunction?通过mexfunction将N个int类型的向量从C++返回到matlab?
【发布时间】:2013-11-05 15:30:52
【问题描述】:

我正在尝试使用 mex 函数将向量返回给 matlab。我将返回指针声明为,

double *retPtr = NULL;

那么返回码如下:

plhs[0] = mxCreateDoubleMatrix(N, 1, mxREAL); 
retPtr = mxGetPr(plhs[0]);

for (int i = 0; i < N; i++) 
{ 
retPtr[i] = forest->predictLabel(&(testData[i*M]), M); 
}

返回类型是 vector ,但我不断收到错误:

Error   1   error C2440: '=' : cannot convert from 'std::vector<_Ty>' to 'double'

我声明指针的方式有问题。任何帮助将不胜感激。

问候, 埃里克

【问题讨论】:

  • 如果您的返回类型是std::vector,您不应该这样声明它而不是指向双精度的指针吗?
  • 我不确定,该怎么做,你能建议怎么做吗?
  • mxGetPr 不熟悉,但编译器似乎在告诉您它返回的内容 - 肯定来自 mxGetPr 行吗?你可以看看this answer

标签: c++ matlab vector compiler-errors mex


【解决方案1】:

如果你改变了

retPtr[i] = forest->predictLabel(&(testData[i*M]), M); 

retPtr[i] = i;

然后它将编译并运行,将向量返回给 MATLAB。

当然,您可能不想要一个简单地从0 计数到N-1 的向量。但是你必须弄清楚 C++ 代码才能得到你想要的数字。我们都不知道你的forest 对象或predictLabel 函数在做什么。


要实际返回N 不同的向量,您可以将它们打包在一个元胞数组中(这样可以改变大小)。

plhs[0] = mxCreateCellMatrix(M, 1);

for (int i = 0; i < N; i++) 
{ 
    std::vector<int> results = forest->predictLabel(&(testData[i*M]), M); 
    mxArray* ithCell = mxCreateDoubleMatrix(results.size(), 1, mxREAL); 
    retPtr = mxGetPr(ithCell);
    for (int j = 0; j < results.size(); ++j)
        retPtr[j] = results[j];
    mxSetCell(plhs[0], i, ithCell);
}

【讨论】:

  • predictlabel 只是计算向量,而 forest 只是用来访问 predictlabel 函数。当我从 predictLabel 返回一个整数值时,它工作正常,没有任何错误,我在 matlab 中得到 N 个输出。
  • @efn:那么您要返回多少个输出? N? N*k?每个predictLabel 调用都有不同数量的元素?您的向量有多个元素,因此它必须在返回给 MATLAB 的矩阵中占据多个元素。
  • 有 N 个向量,但每个向量的元素数量不同,但我可以设置一个上限,因为我知道它不会超过的元素数量。
  • @efn:那么,当数据返回到 MATLAB 时应该是什么样子?在未使用的插槽中包含 NaN 的方阵?不同长度的向量的单元数组?所有单个向量连接成一个列向量?首先手动将数据放入 MATLAB 变量中,然后您(如果需要,可以在我们的帮助下)找出 C++ MEX 代码来生成它。
  • @efn:关键是您编写了代码,正如您的问题所说,将“a”向量返回给 MATLAB。但你实际上有N 向量。
猜你喜欢
  • 2018-03-04
  • 2015-03-28
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
相关资源
最近更新 更多