我已经研究了几天,尝试了我能想到的所有变体,并查看了无数示例。我只是无法让它工作。
我正在尝试制作一个 mexFunction 以从 matlab 调用。这个 mexFunction 调用我拥有的另一个 C 函数,我们称它为 retrieveValues,并返回一个数组和该数组的长度。我需要将这两个返回给 matlab 函数,据我所知,这意味着我需要将它们放在 plhs
数组中。
我这样从 matlab 调用我的 mexFunction:
[foofooArray, foofooCount] = getFoo();
根据我的理解,这意味着 nlhs = 2
,plhs
是一个长度为 2 的数组,nrhs = 0
,并且 prhs
只是一个指针。
这是我的 mexFunction 代码:
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray* prhs[])
{
foo* fooArray
int fooCount
plhs = mxCreateNumericMatrix(1, 2, mxUINT64_CLASS, mxREAL);
//feels like I shouldn't need this
retrieveValues(&fooArray, &fooCount);
plhs[0] = fooArray;
plhs[1] = fooCount;
}
运行 matlab 程序让我调用期间未分配一个或多个输出参数
我已经测试并确认值正在从 retrieveValues
正确返回。
最佳答案
您是正确的,不需要 plhs = mxCreateNumericMatrix(...)
。另外,请注意 nlhs
是您在 MATLAB 中提供的左侧的数量 - 因此在您的情况下,您使用 2 个左侧调用它。以下是返回普通标量值的方法:
plhs[0] = mxCreateDoubleScalar(2);
plhs[1] = mxCreateDoubleScalar(3);
要处理您的实际返回值,您需要执行一些操作以将值从 foo
复制到新创建的 mxArray 中。例如,如果您的函数返回 double 值,您可以这样做:
double * values;
int numValues;
myFcn(&values, &numValues);
/* Build a 1 x numValues real double matrix for return to MATLAB */
plhs[0] = mxCreateDoubleMatrix(1, numValues, mxREAL);
/* Copy from 'values' into the data part of plhs[0] */
memcpy(mxGetPr(plhs[0]), values, numValues * sizeof(double));
编辑 当然,有人需要在我的示例和您的示例中取消分配 values
。
EDIT 2 完整的可执行示例代码:
#include <string.h>
#include "mex.h"
void doStuff(double ** data, int * numData) {
*numData = 7;
*data = (double *) malloc(*numData * sizeof(data));
for (int idx = 0; idx < *numData; ++idx) {
(*data)[idx] = idx;
}
}
void mexFunction( int nlhs, mxArray * plhs[],
int nrhs, const mxArray * prhs[] ) {
double * data;
int numData;
doStuff(&data, &numData);
plhs[0] = mxCreateDoubleMatrix(1, numData, mxREAL);
memcpy(mxGetPr(plhs[0]), data, numData * sizeof(double));
free(data);
plhs[1] = mxCreateDoubleScalar(numData);
}
关于c - 通过 mex 传回数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21309900/