MATLAB mex API与MATLAB引擎API之间的差异

Difference between MATLAB mex API to MATLAB engine API

本文关键字:MATLAB API 引擎 mex 之间      更新时间:2023-10-16

我很难通过matlab的引擎API获取(因此也很难设置)图形对象的属性:我总是在以下代码中获取空指针(在windows 8.1上使用R2015b):

#include <engine.h>
#include <matrix.h>
#include <mex.h>
#include <mat.h>
int main()  
{ 
  Engine *MATLAB;
  if (!(MATLAB = engOpen(NULL))) 
  {
    //exit failure etc.
  }
   engEvalString(MATLAB, "clearvars;close all;x=linspace(-pi,pi);figure;h=plot(x,sin(x),'o-b','LineWidth',2.5);");//OK!! got the plot on a new figure
   const mxArray *ph = engGetVariable(MATLAB, "h");//OK!!
   const char *cname = mxGetClassName(ph);// OK!!!: got cname = matlab.graphics.chart.primitive.Line
   size_t ind = 0;
   const char *Prop = "LineWidth";
   mxArray *p = mxGetProperty(ph,ind,Prop);//bummer !!! - p is always NULL!!
   return 0;
}

现在,当使用mex API编写等效代码时,一切都很好地工作如下:

1:我正在运行下一个MATLAB脚本:

mex getMex.cpp;%compile getMex.cpp (with VS 2010 Ultimate), see code below
clearvars;close all;x=linspace(-pi,pi);figure;h=plot(x,sin(x),'o-b','LineWidth',2.5);%OK!! got the plot on a new figure
LineWidth = getMex(h);% OK!!  LineWidth = 2.5

getMex.cpp源文件:

#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, 
             const mxArray *prhs[])
{
  //some input/output checks here
  mxArray *p = mxGetProperty(prhs[0],0,"LineWidth");  //OK!!! - not NULL
  double *p2h=mxGetPr(p);//OK!!! *p2h = 2.5
  plhs[0] = p;
}

在VS2010中调试mex代码和引擎代码时,我看到了相同的dll被加载恰好

我的引擎API代码有什么问题?

我在这里错过了什么?

显然这是不可能的)-:,这是我从mathworks支持得到的答案:

不能在C/C++MATLAB引擎代码中使用MEX API函数。客户可以使用MEX API从MATLAB脚本调用C、C++或Fortran代码。MATLAB引擎API实现了MATLAB和C/C++之间的相反交互。使用MATLAB引擎,客户可以利用MATLAB在C或C++代码中的功能。这两个API之间的区别解释了为什么MEX API函数"mxGetProperty"在MEX文件"getMex.cpp"中返回"LineWidth"的正确值,但在MATLAB引擎实现中返回NULL。

然而,您的用例揭示了MATLAB中当前的两个差异:

  1. 我们的文档没有说明MEX API不应在MATLAB引擎的上下文中使用。如果在MATLAB引擎代码中使用MEX函数,我们也不会向用户显示任何错误消息。我已将此反馈提交给我们的开发组织,作为增强请求。

  2. 您可以在MATLAB中使用MEX函数"mxGetClassName"发动机代码。能够这样做与MEX函数不应该在MATLAB引擎中工作的事实相矛盾。我已经让开发人员知道"mxGetClassName"可以和MATLAB引擎一起使用。