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

Posted

技术标签:

【中文标题】如何正确传递输入并从 Mex 函数获取输出?【英文标题】:How to correctly pass inputs and get outputs from Mex function? 【发布时间】:2021-09-01 10:39:27 【问题描述】:

这是我第一次尝试生成 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为0。 因此,当我收集输入变量和尝试返回输出时,我认为是错误的(可能在 C 代码中)。但我不知道如何纠正它们。 有什么帮助吗?

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

typedef enum new_type

    Red;
    Blue;
    Yellow;
 new_type;

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

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

其中 index 是一个新类型。现在C代码中的Index是对的,Flag = 1,表示src_Function的求值成功。

[编辑] 要返回标志,我使用了指针。有用。谢谢

【问题讨论】:

可以双投到你的new_type 吗?您是否尝试过将其设为双精度并检查其值? @AnderBiguri 感谢您的回答,我将帖子编辑为回复 请更新整个问题文本,而不是在底部添加“edit”行。阅读这个问题,我认为您的主要问题不是在 MATLAB 中获得 Flag 的值,但显然您已经弄清楚了。由于您还没有任何答案,请更新您的问题以反映您当前对问题的理解。不知道你还有什么问题。 注意#include "source.c" 很尴尬。您应该包含一个包含函数声明和类型的头文件,并单独编译和链接 C 源文件,如下所示:mex src_Function_mex.c source.c 关于:#include "math.h" math.h 是一个系统函数,因此应通过以下方式包含:$include <math.h>` 【参考方案1】:

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

#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));

【讨论】:

请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。

以上是关于如何正确传递输入并从 Mex 函数获取输出?的主要内容,如果未能解决你的问题,请参考以下文章

如何逐行读取 Matlab mex 函数的输入矩阵?

如何访问传递给 MEX 函数的矩阵成员?

Matlab MEX-函数副作用

如何在运行时制作 mex 函数 printf?

如何查看从 Matlab 中 Mex 函数使用的 DLL 调用的 printf 的输出?

使用集合调用构造函数类并从 asyncTask 获取 sharedpreferences(无法传递上下文)