如何在我的代码中使用Matlab引擎(用于调用`engOpenSingleUse()`)?

时间:2012-03-11 12:35:30

标签: c++ visual-studio matlab matlab-engine

我正在尝试将简单的字符串命令发送到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命令窗口”打开;我得到一个如下屏幕:

Empty Matlab Command Window

如您所见,命令窗口为空。屏幕上没有绘图窗口 当我手动在此窗口中输入命令时,我得到的绘图没有任何错误,如下所示:

Manually typed command to the command window

这是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)

1 个答案:

答案 0 :(得分:4)

根据您链接的文档,engOpenSingleUse的字符串参数是“start”命令 - 这不是要执行的MATLAB命令。 engOpenSingleUse只需启动 MATLAB引擎 - 您必须通过engEvalString

调用另一个函数来实际使用引擎
Engine* matlabEngine = engOpenSingleUse(0, vpDcom, &iReturnValue);
engEvalString(matlabEngine, PlotCommand.c_str());

engOpenSingleUse只是意味着它启动的引擎只能由一个应用程序使用,它将执行一个命令字符串。

From the docs:

  

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指针。