如何正确传递输入并从 Mex 函数获取输出?

How to correctly pass inputs and get outputs from Mex function?

这是我第一次尝试生成 MEX 函数。我看到了它的一些例子,但是当我试图模仿它们时我失败了。 我需要创建一个 MEX 函数,该函数通过 C 代码调用一个子例程,在该子例程中评估某个函数。 我开始的 C 代码是这样的:

#include "mex.h"
#include "math.h"
#include "source.c"

#define MXCLASS mxSINGLE_CLASS 

void mexFunction(int nlhs, mxArray *plhs[],
                 int nrhs, const mxArray *prhs[])
{   
    /* input */
    new_type Index;
    
    /* output */
    INTEGER Flag;
    FLOAT *Result;
    
    Index = (new_type)mxGetScalar(prhs[0]);
    
    plhs[0] = mxCreateNumericMatrix(1,1,mxINT16_CLASS,mxREAL); 
    plhs[1] = mxCreateNumericMatrix(1,1,MXCLASS,mxREAL); 
    
    Flag = (INTEGER)mxGetScalar(plhs[0]);
    Result = (FLOAT *)mxGetPr(plhs[1]);
    
    
    Flag = src_Function(Index, Result);

}

其中source.c是定义子程序的C文件,src_Function()是子程序。包含 src_Function() 是正确的,因为 MEX 函数的创建是成功的。 new_type是source.c中定义的枚举类型。 子程序在source.c中定义为

INTEGER src_Function(new_type Index, FLOAT* Result)
{
...
return Flag;
}

并且结果在 src_Function 内计算。 MEX函数的调用是

[flag,result] = feval('src_Function_mex',index);

其中 src_Function_mex.mexw64 是由 Matlab 创建的 MEX 文件。 首先,调用 MEX 函数,我得到标志和结果均为零。所以我做了一些调试,发现我未能将输入变量索引传递给 MEX 函数。 实际上,C 代码中的 Index 为零,没有任何意义。这会导致 src_Function 的评估不正确,因此表示计算是否失败的 Flag 具有有效值 (Flag = -1),它报告计算中的一些失败。 当我检索标志作为 MEX 函数的输出时,会发生另一个错误。因为 C 代码中的 Flag 是 -1,而 Matlab 中的 flag 是零。 因此,当我收集输入变量并尝试 return 输出时,我认为是错误的(可能在 C 代码中)。但我不知道如何纠正它们。 有什么帮助吗?

[编辑] 非常感谢您的建议,安德! enum new_type 的元素如下:

typedef enum new_type
{
    Red;
    Blue;
    Yellow;
} new_type;

我试图通过将相应的双精度作为输入变量传递来编辑 MEX 函数调用

[flag,result] = feval('src_Function_mex',double(index));

其中索引是 new_type。现在C代码中的Index是对的,Flag = 1,表示src_Function求值成功

[编辑] 为了 return Flag 我使用了指针。有用。谢谢

输入通过强制转换传递,输出使用指针返回

#include "mex.h"
#include <math.h>
#include "source.c"

#define MXCLASS mxSINGLE_CLASS 

void mexFunction(int nlhs, mxArray *plhs[],
                 int nrhs, const mxArray *prhs[])
{   
    /* input */
    new_type Index;
    
    /* output */
    INTEGER *Flag;
    FLOAT *Result;
    
    Index = (new_type)mxGetScalar(prhs[0]);
    
    plhs[0] = mxCreateNumericMatrix(1,1,mxINT16_CLASS,mxREAL); 
    plhs[1] = mxCreateNumericMatrix(1,1,MXCLASS,mxREAL); 
    
    Flag = (INTEGER *)mxGetPr(plhs[0]);
    Result = (FLOAT *)mxGetPr(plhs[1]);
    
    
    *Flag = src_Function(Index, Result);

}

函数调用是

[flag,result] = feval('src_Function_mex',double(index));