3

我正在尝试向 Matlab 引擎发送简单的字符串命令。

这是我的代码(我的代码中的其他任何地方都没有与 Matlab API 相关的代码,除了该#include "engine.h"行):

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 命令窗口”打开;我得到如下屏幕:

空的 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 /regserver在 Matlab 主窗口中输入了命令(如engOpenSingleUse()函数文档页面中所述),以确保 Matlab 引擎已注册到我的操作系统。

engOpenSingleUse()为什么我调用该函数时没有任何反应?
为什么我在对象中发送字符串命令进行绘图时没有弹出绘图窗口PlotCommand
我究竟做错了什么?

操作系统:Windows 7 Ultimate x64 SP1,最新
IDE:Visual Studio 2010,(版本 10.0.40219.1 SP1Rel)
Matlab:7.8.0 (R2009a)

4

1 回答 1

4

根据您链接到的文档,字符串参数engOpenSingleUse是“开始”命令 - 这不是要执行的 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 操作系统的指针,如果打开失败,则返回 NULL。

UNIX 操作系统 UNIX 系统不支持。

为了完整起见,我将提到您还应该检查以确保 engOpen 调用返回一个非 NULL 指针,然后再继续您的程序。

于 2012-03-11T18:38:29.140 回答