我正在尝试将简单的字符串命令发送到Matlab引擎。
这是我的代码(除了#include "engine.h"
行之外,我的代码中的其他任何地方都没有与Matlab API相关的代码):
void MatlabPlotter::DrawInMatlab() const
{
std::string PlotCommand = "x=[0 1 2 3 4 5];y=[0 1 4 9 16 25];plot(x, y);";
void * vpDcom = NULL;
int iReturnValue;
engOpenSingleUse(PlotCommand.c_str(), vpDcom, &iReturnValue);
}
代码编译并成功运行,没有任何编译器错误或运行时错误消息。 “Matlab命令窗口”打开;我得到一个如下屏幕:
如您所见,命令窗口为空。屏幕上没有绘图窗口 当我手动在此窗口中输入命令时,我得到的绘图没有任何错误,如下所示:
这是engOpenSingleUse()
功能的官方文档页面:
http://www.mathworks.com/help/techdoc/apiref/engopensingleuse.html
我在项目中添加了<MatlabInstallationDir>\extern\lib\win64\microsoft\libeng.lib
库(我正在编译x64调试配置)
我添加了<MatlabInstallationDir>\extern\include\engine.h
头文件
我在主Matlab窗口中输入!matlab /regserver
命令(如engOpenSingleUse()
函数的文档页面中所述),以确保Matlab引擎已注册到我的操作系统。
当我调用engOpenSingleUse()
函数时,为什么没有发生任何事情?
当我在PlotCommand
对象中发送字符串命令来绘制绘图时,为什么不弹出绘图窗口?
我做错了什么?
操作系统:Windows 7旗舰版x64 SP1,最新版
IDE:Visual Studio 2010,(版本10.0.40219.1 SP1Rel)
Matlab:7.8.0(R2009a)
答案 0 :(得分:4)
根据您链接的文档,engOpenSingleUse
的字符串参数是“start”命令 - 这不是要执行的MATLAB命令。 engOpenSingleUse
只需启动 MATLAB引擎 - 您必须通过engEvalString
Engine* matlabEngine = engOpenSingleUse(0, vpDcom, &iReturnValue);
engEvalString(matlabEngine, PlotCommand.c_str());
engOpenSingleUse
只是意味着它启动的引擎只能由一个应用程序使用,不它将执行一个命令字符串。
C语法
#include "engine.h"
Engine *engOpenSingleUse(const char *startcmd, void *dcom, int *retstatus);
参数:
startcmd要启动的字符串 MATLAB过程。在Microsoft Windows系统上,startcmd字符串必须 是NULL。
dcom保留供将来使用;必须为NULL。
retstatus返回状态;可能的失败原因。
仅返回引擎的Microsoft Windows操作系统指针 handle,如果打开失败则返回NULL。
UNIX操作系统UNIX系统不支持。
为了完整起见,我要提到你还应该检查以确保engOpen调用在继续你的程序之前返回了一个非NULL指针。