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デバッグ構成でコンパイルしています)。ヘッダーファイル
をインクルードしました。Matlabのメインウィンドウにコマンドを 入力して(関数のドキュメントページで説明されているように)、MatlabエンジンがOSに登録されていることを確認しました。<MatlabInstallationDir>\extern\include\engine.h
!matlab /regserverengOpenSingleUse()

engOpenSingleUse()関数を呼び出しても何も起こらないのはなぜですか?オブジェクト
で文字列コマンドを送信してプロットをプロットすると、プロットウィンドウがポップアップしないのはなぜですか? 私は何が間違っているのですか?PlotCommand

OS:Windows 7 Ultimate x64 SP1、最新の
IDE:Visual Studio 2010、(バージョン10.0.40219.1 SP1Rel)
Matlab:7.8.0(R2009a)

4

1 に答える 1

4

リンク先のドキュメントによると、toの文字列引数engOpenSingleUseは「start」コマンドです。これは実行されるMATLABコマンドではありません。 MATLABエンジンを起動engOpenSingleUseするだけです。engEvalStringを介してエンジンを実際に使用するには、別の関数を呼び出す必要があります。

Engine* matlabEngine = engOpenSingleUse(0, vpDcom, &iReturnValue);
engEvalString(matlabEngine, PlotCommand.c_str());

engOpenSingleUse起動するエンジンは1つのアプリケーションでのみ使用できることを意味し、単一のコマンド文字列を実行することはありません。

ドキュメントから:

C構文

#include "engine.h"
Engine *engOpenSingleUse(const char *startcmd, void *dcom,   int *retstatus);

引数:

startcmdMATLABプロセスを開始する文字列。Microsoft Windowsシステムでは、startcmd文字列はNULLである必要があります。

dcom将来の使用のために予約されています。NULLである必要があります。

retstatusステータスを返します。考えられる障害の原因。

MicrosoftWindowsオペレーティングシステムのみをエンジンハンドルへのポインタとして返します。開くことが失敗した場合はNULLを返します。

UNIXオペレーティングシステムUNIXシステムではサポートされていません。

完全を期すために、プログラムを続行する前に、engOpen呼び出しがNULL以外のポインターを返したことを確認する必要があることにも言及します。

于 2012-03-11T18:38:29.140 に答える