c++ - 将 float * 或 int * 分配给 mxArray

标签 c++ matlab mex

我使用 mex 在 matlab 中得到了一个典型的 cpp 函数

#include "mex.h"

void func (int * rowvec, int * colvec, float * valvec, int * nnz){/*fill arguments*/}



void mexFunction(int nlhs, mxArray *plhs[],
                 int nrhs, const mxArray *prhs[])

我在其中检查是否有足够的可用输出变量

if(nlhs != 4) {
  mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nlhs",
                  "Four outputs required.");
}

此外,在这个函数中我声明了四个变量:

int *rowvec;        /* 1st output array */
int *colvec;        /* 2nd output array */
float *valvec;      /* 3rd output array */
int *nnz;           /* 4th output scalar */

它们将在函数中定义/填充:

func(rowvec, colvec, valvec, nnz) //arguments get filled with values

现在我想做这样的事情:

plhs[0] = rowvec;
plhs[1] = colvec;
plhs[2] = valvec;
plhs[3] = nnz;

不幸的是,它抛出了四个可以理解的错误,因为它们是两种不同的数据类型。错误是这样的:

cannot convert ‘int*’ to ‘mxArray* {aka mxArray_tag*}’ in assignment plhs[0] = rowvec;

我该如何解决这个问题?

最佳答案

你错过了一步。

您需要使用 mxCreateNumericArray并将其分配给您的输出参数。

然后在创建的数组上使用 mxGetData 并将您的 int/float 指针设置为它。

然后调用 func 来填充输出。

plhs[0] = mxCreateNumericArray(ndim, *dims, classid, ComplexFlag);
...
rowvec=(int*)mxGetData(plhs[0]);
...
func(rowvec, colvec, valvec, nnz);

如果可以更改接口(interface),则可能需要考虑使用 func(plhs)。在使用指针之前,您需要知道输出数组的大小。

关于c++ - 将 float * 或 int * 分配给 mxArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38357392/

相关文章:

c++ - 我可以在等待/信号信号灯中切换测试和修改部分吗?

c++ - 无法删除 txt 文件中 getline(cin, (variable)) 后的下一行

c++ - 在 C++ 中实现基于模板的可选类成员的最有效方法?

.net - 在哪里启用元数据(在配置中启用)?

c++ - SQLite 在最后一次引用删除时删除共享行

matlab - 多个矩阵乘以多个向量的快速乘法

matlab - Matlab 中 eval 函数内的控制流

matlab:不循环不同大小子数组的总和

matlab - 从win64到win32的pnet通信

matlab - 如何使用 CUDA 功能阻止 Matlab 在(错误的)mex 文件执行时崩溃