关于 MATLAB 中 MEX 函数逻辑输出的问题
Issue about logical output from MEX function in MATLAB
为什么我的 MEX 函数的输出总是 1,尽管它应该是 0?
我写了如下所示的 MEX 源代码
#include "mex.h"
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
{
bool *x,*y;
/* Create matrix for the return argument. */
plhs[0] = mxCreateLogicalMatrix(1,1);
/* Assign pointers to each input and output. */
x = mxGetLogicals(prhs[0]); //input
y = mxGetLogicals(plhs[0]); //output
/* Calculations. */
if (*x == 0) *y = 1;
else *y = 0;
}
并出现以下内容:
y = test(5)
y =
1
我想向您指出 mxGetLogicals
的文档。部分文档说:
Returns
Pointer to the first logical element in the mxArray
. The result is unspecified if the mxArray
is not a logical array.
您传递的是 double
精度数字, 不是 logical
。通过这样做,您将获得未定义的行为。因此,您可以通过三种方式解决此错误:
- 将实际的
logical
值传递给函数。
- 一切保持原样,但改变你要返回的东西。将
*y = 1
和 *y = 0
分别更改为 true
和 false
,但输入必须是 double
.
- 您基本上必须将对
logical / bool
的任何引用更改为 double
。具体来说,将 mxGetLogicals
更改为 mxGetPr
so you can get a pointer to a double
precision real array. You'll also need to change mxCreateLogicalMatrix
to mxCreateDoubleMatrix
,您必须将指针从 bool
更改为 double
。
选项 #1 - 将 logical
值传递给函数:
您只需要做:
y = test(false);
或:
y = test(true);
运行 经过这些更改,我得到以下结果:
>> y = test(false)
y =
1
>> y = test(true)
y =
0
选项 #2 - 输入类型为 double
,输出类型为 bool
:
您需要进行以下更改:
#include "mex.h"
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
{
double *x;
bool *y; // Change
/* Create matrix for the return argument. */
plhs[0] = mxCreateLogicalMatrix(1,1);
/* Assign pointers to each input and output. */
x = mxGetPr(prhs[0]); //input - Change
y = mxGetLogicals(plhs[0]); //output
/* Calculations. */
if (*x == 0) *y = true; // Change
else *y = false;
}
运行 经过上述更改的这段代码给我:
>> y = test(0)
y =
1
>> y = test(5)
y =
0
选项 #3 - 将 bool
行为更改为 double
:
#include "mex.h"
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
{
double *x,*y; // Change
/* Create matrix for the return argument. */
plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL); // Change
/* Assign pointers to each input and output. */
x = mxGetPr(prhs[0]); //input - Change
y = mxGetPr(plhs[0]); //output - Change
/* Calculations. */
if (*x == 0) *y = 1;
else *y = 0;
}
运行 经过上述更改的这段代码给我:
>> y = test(0)
y =
1
>> y = test(5)
y =
0
为什么我的 MEX 函数的输出总是 1,尽管它应该是 0?
我写了如下所示的 MEX 源代码
#include "mex.h"
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
{
bool *x,*y;
/* Create matrix for the return argument. */
plhs[0] = mxCreateLogicalMatrix(1,1);
/* Assign pointers to each input and output. */
x = mxGetLogicals(prhs[0]); //input
y = mxGetLogicals(plhs[0]); //output
/* Calculations. */
if (*x == 0) *y = 1;
else *y = 0;
}
并出现以下内容:
y = test(5)
y =
1
我想向您指出 mxGetLogicals
的文档。部分文档说:
Returns
Pointer to the first logical element in the
mxArray
. The result is unspecified if themxArray
is not a logical array.
您传递的是 double
精度数字, 不是 logical
。通过这样做,您将获得未定义的行为。因此,您可以通过三种方式解决此错误:
- 将实际的
logical
值传递给函数。 - 一切保持原样,但改变你要返回的东西。将
*y = 1
和*y = 0
分别更改为true
和false
,但输入必须是double
. - 您基本上必须将对
logical / bool
的任何引用更改为double
。具体来说,将mxGetLogicals
更改为mxGetPr
so you can get a pointer to adouble
precision real array. You'll also need to changemxCreateLogicalMatrix
tomxCreateDoubleMatrix
,您必须将指针从bool
更改为double
。
选项 #1 - 将 logical
值传递给函数:
您只需要做:
y = test(false);
或:
y = test(true);
运行 经过这些更改,我得到以下结果:
>> y = test(false)
y =
1
>> y = test(true)
y =
0
选项 #2 - 输入类型为 double
,输出类型为 bool
:
您需要进行以下更改:
#include "mex.h"
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
{
double *x;
bool *y; // Change
/* Create matrix for the return argument. */
plhs[0] = mxCreateLogicalMatrix(1,1);
/* Assign pointers to each input and output. */
x = mxGetPr(prhs[0]); //input - Change
y = mxGetLogicals(plhs[0]); //output
/* Calculations. */
if (*x == 0) *y = true; // Change
else *y = false;
}
运行 经过上述更改的这段代码给我:
>> y = test(0)
y =
1
>> y = test(5)
y =
0
选项 #3 - 将 bool
行为更改为 double
:
#include "mex.h"
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
{
double *x,*y; // Change
/* Create matrix for the return argument. */
plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL); // Change
/* Assign pointers to each input and output. */
x = mxGetPr(prhs[0]); //input - Change
y = mxGetPr(plhs[0]); //output - Change
/* Calculations. */
if (*x == 0) *y = 1;
else *y = 0;
}
运行 经过上述更改的这段代码给我:
>> y = test(0)
y =
1
>> y = test(5)
y =
0