c - 通过 mex 传回数组

标签 c matlab mex

我已经研究了几天,尝试了我能想到的所有变体,并查看了无数示例。我只是无法让它工作。

我正在尝试制作一个 mexFunction 以从 matlab 调用。这个 mexFunction 调用我拥有的另一个 C 函数,我们称它为 retrieveValues,并返回一个数组和该数组的长度。我需要将这两个返回给 matlab 函数,据我所知,这意味着我需要将它们放在 plhs 数组中。

我这样从 matlab 调用我的 mexFunction:

[foofooArray, foofooCount] = getFoo();

根据我的理解,这意味着 nlhs = 2plhs 是一个长度为 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/

相关文章:

c - 为什么 C 编译器不能进行类型推断?

c - mex 文件和使用 coder.ceval 调用的函数之间有什么区别吗?

c++ - 无法将参数 1 从 'char *' 转换为 'const caffe::NetParameter

C:使用具有 "getter"函数和中断的静态 volatile

c - GCC ARM C 编译器不遵守 -std=c99 的 %llx printf 格式化代码

c - 什么可能导致此缓冲区溢出?

Matlab 3D 剂量阵列可视化

matlab - 将 containers.Map 作为类属性时奇怪的 MATLAB 行为

matlab - 如何在 Matlab 中推断出更高的值?

linux - 尝试查找并安装 libstdc++.so.5 以使用 mex 为 MATLAB 运行 C++