MATLAB mex API与MATLAB引擎API之间的差异
Difference between MATLAB mex API to MATLAB engine API
我很难通过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中当前的两个差异:
我们的文档没有说明MEX API不应在MATLAB引擎的上下文中使用。如果在MATLAB引擎代码中使用MEX函数,我们也不会向用户显示任何错误消息。我已将此反馈提交给我们的开发组织,作为增强请求。
您可以在MATLAB中使用MEX函数"mxGetClassName"发动机代码。能够这样做与MEX函数不应该在MATLAB引擎中工作的事实相矛盾。我已经让开发人员知道"mxGetClassName"可以和MATLAB引擎一起使用。
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 用于访问容器<T>数据成员的正确 API
- 如何使用Luacneneneba API正确读取字符串和表参数
- C++MySQL C api用户输入行
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 如何使用 AWS Transcribe C++ API 中的'StartTranscriptionJobRequest'?
- 将std::string传递给WriteConsole API
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 在gtest.中使用fff.h模拟系统API
- 有没有任务栏API可以立即应用注册表更改
- C++win32 API创建多个类似视口的窗口
- 使用libcurl提交批量url的正确BING Api POST url是什么
- 如何使用 "Matlab Data / Engine API for c++" 在 c++ 中加载 .mat
- MATLAB API用于使用MatgetDir的C例外:Matrix :: Serialize ::在内存位置内置
- 用C++MATLAB API定义二维数组
- MATLAB mex API与MATLAB引擎API之间的差异
- 使用STL容器从c++中读取.mat文件的Matlab API
- C/MATLAB API接口环境变量设置影响OS X中的其他应用程序
- Matlab引擎API的线程安全性