Как использовать движок Matlab в моем коде (для вызова `engOpenSingleUse ()`)? - PullRequest
3 голосов
/ 11 марта 2012

Я пытаюсь отправить простые строковые команды в движок Matlab.

Это мой код (в моем коде больше нет кода, связанного с API Matlab, кроме строки #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»; Я получаю экран, как показано ниже:

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 /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)

1 Ответ

4 голосов
/ 11 марта 2012

В соответствии с документацией, на которую вы ссылались, строковый аргумент 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 возвратил ненулевой указатель, прежде чем продолжить работу с вашей программой.

...