通过mex传回数组

Nea*_*lon 1 c matlab mex

我已经在这里待了几天,尝试了我能想到的每一个变化,并看了无数的例子.我无法让它发挥作用.

我正在尝试使用matlab调用mexFunction.这个mexFunction调用我的另一个C函数,让它调用它retrieveValues,并返回一个数组和该数组的长度.我需要将这两个返回到matlab函数,据我所知,这意味着我需要将它们放在plhs数组中.

我从matlab调用我的mexFunction,如下所示:

[foofooArray, foofooCount] = getFoo();
Run Code Online (Sandbox Code Playgroud)

根据我的理解,这意味着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;
}
Run Code Online (Sandbox Code Playgroud)

运行matlab程序得到了我 One or more output arguments not assigned during call

我已经测试并确认retrieveValues正确返回值.

Edr*_*ric 5

你是对的plhs = mxCreateNumericMatrix(...),不需要.另外,请注意,这nlhs是您在MATLAB中提供的左侧数量 - 因此,在您的情况下,您将使用2个左侧调用左侧.以下是返回琐碎标量值的方法:

plhs[0] = mxCreateDoubleScalar(2);
plhs[1] = mxCreateDoubleScalar(3);
Run Code Online (Sandbox Code Playgroud)

要处理实际的返回值,您需要做一些事情来将值复制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));
Run Code Online (Sandbox Code Playgroud)

编辑当然有人需要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);
}
Run Code Online (Sandbox Code Playgroud)