如何正确传递输入并从 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 函数获取输出?的主要内容,如果未能解决你的问题,请参考以下文章