我已经在这里呆了几天了,尝试了我能想到的每一个变化,并看了无数的例子。我无法让它发挥作用。
我正在尝试使用matlab调用mexFunction。这个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程序会让我One or more output arguments not assigned during call
我已经测试并确认正确地从retrieveValues
返回了值。
答案 0 :(得分:5)
你是正确的,不需要plhs = mxCreateNumericMatrix(...)
。另外,请注意nlhs
是你在MATLAB中提供的左手边数 - 所以在你的情况下,你用两个左手边来调用它。以下是返回琐碎标量值的方法:
plhs[0] = mxCreateDoubleScalar(2);
plhs[1] = mxCreateDoubleScalar(3);
要处理实际的返回值,您需要执行一些操作,将值从foo
复制到新创建的mxArray中。例如,如果您的函数返回了双精度数,则可以执行以下操作:
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
。
编辑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);
}
答案 1 :(得分:2)
以下是一个例子:
#include "mex.h"
#include <stdlib.h>
#include <string.h>
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray* prhs[])
{
// validate number of arguments
if (nrhs != 0 || nlhs > 2) {
mexErrMsgTxt("Wrong number of arguments");
}
// create C-array (or you can recieve this array from a function)
int len = 5;
double *arr = (double*) malloc(len*sizeof(double));
for(int i=0; i<len; i++) {
arr[i] = 10.0 * i;
}
// return outputs from MEX-function
plhs[0] = mxCreateDoubleMatrix(1, len, mxREAL);
memcpy(mxGetPr(plhs[0]), arr, len*sizeof(double));
if (nlhs > 1) {
plhs[1] = mxCreateDoubleScalar(len);
}
// dellocate heap space
free(arr);
}
>> mex -largeArrayDims testarr.cpp
>> [a,n] = testarr
a =
0 10 20 30 40
n =
5