【发布时间】: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>`