如何正确传递输入并从 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));
这是我第一次尝试生成 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));