关于 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。通过这样做,您将获得未定义的行为。因此,您可以通过三种方式解决此错误:

  1. 将实际的 logical 值传递给函数。
  2. 一切保持原样,但改变你要返回的东西。将 *y = 1*y = 0 分别更改为 truefalse,但输入必须是 double.
  3. 您基本上必须将对 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