engOpen (C)
MATLAB エンジン セッションの開始
C 構文
#include "engine.h" Engine *engOpen(const char *startcmd);
説明
engOpen は、MATLAB® を計算エンジンとして使用するための MATLAB プロセスを開始します。
Windows プラットフォーム
engOpen はデスクトップなしで MATLAB を起動します。
この関数は MATLAB への COM チャネルを開きます。インストール中に登録した MATLAB ソフトウェアが起動します。インストール中に登録しなかった場合は、COM サーバーとしての MATLAB の登録を参照してください。
UNIX プラットフォーム
UNIX® システムでは、engOpen は以下を行います。
2 つのパイプを作成します。
新しいプロセスを分岐します。MATLAB (親) ソフトウェアからエンジン プログラム (子) 内の 2 つのファイル記述子に
stdinとstdoutを渡すようにパイプを設定します。MATLAB ソフトウェアを実行するコマンド (リモート実行の場合は
rsh) を実行します。
メモ
C++ 用の MATLAB エンジン API の matlab::engine::startMATLAB が engOpen よりも推奨されます。C++ 用の MATLAB エンジン API には、エンジン アプリケーションを作成するための最新の C++ 機能が含まれています。詳細については、C++ からの MATLAB の呼び出しを参照してください。engOpen や C 用のエンジン API を削除する予定はありません。
入力引数
MATLAB の起動コマンド。const char * として指定します。
Windows® システムでは、startcmd 文字列は NULL でなければなりません。
UNIX システムでは、次のようになります。
startcmdがNULLまたは空の文字列の場合、engOpenはコマンドmatlabを使用して現在のホストで MATLAB プロセスを開始します。startcmdがhostnameである場合、engOpenは指定されているhostname文字列をより大きな文字列に組み込むことで、指定されたホストで MATLAB プロセスを開始します。"rsh hostname \"/bin/csh -c 'setenv DISPLAY\ hostname:0; matlab'\""
startcmdが他の文字列 (空白、または英数字以外の文字を含む) である場合、MATLAB は文字列を文字どおりに実行します。
出力引数
MATLAB エンジンへのハンドル。Engine * として指定します。開けなかった場合、関数は NULL を返します。
例
Windows での C からの MATLAB エンジン関数の呼び出し
次の C コードでは、Windows システムで C プログラムから MATLAB エンジン関数を呼び出す方法を示します。
/*
* engwindemo.c
*
* This program illustrates how to call MATLAB
* Engine functions from a C program on Windows.
*
* Copyright 1984-2017 The MathWorks, Inc.
*/
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "engine.h"
#include <matrix.h>
#define BUFSIZE 256
static double Areal[6] = { 1, 2, 3, 4, 5, 6 };
int PASCAL WinMain (HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszCmdLine,
int nCmdShow)
{
Engine *ep;
mxArray *T = NULL, *a = NULL, *d = NULL;
char buffer[BUFSIZE+1];
double *Dreal, *Dimag;
double time[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
/*
* Start MATLAB engine
*/
if (!(ep = engOpen(NULL))) {
MessageBox ((HWND)NULL, (LPSTR)"Can't start MATLAB engine",
(LPSTR) "Engwindemo.c", MB_OK);
exit(-1);
}
/*
* PART I
*
* For the first half of this demonstration, we will send data
* to MATLAB, analyze the data, and plot the result.
*/
/*
* Create a variable from our data
*/
T = mxCreateDoubleMatrix(1, 10, mxREAL);
/*
* Copy data from time to matrix T
*/
#if MX_HAS_INTERLEAVED_COMPLEX
memcpy(mxGetDoubles(T), time, 10*sizeof(double));
#else
memcpy(mxGetPr(T), time, 10*sizeof(double));
#endif
/*
* Place the variable T into the MATLAB workspace
*/
engPutVariable(ep, "T", T);
/*
* Evaluate a function of time, distance = (1/2)g.*t.^2
* (g is the acceleration due to gravity)
*/
engEvalString(ep, "D = .5.*(-9.8).*T.^2;");
/*
* Plot the result
*/
engEvalString(ep, "plot(T,D);");
engEvalString(ep, "title('Position vs. Time for a falling object');");
engEvalString(ep, "xlabel('Time (seconds)');");
engEvalString(ep, "ylabel('Position (meters)');");
/*
* PART II
*
* Create another mxArray, put it into MATLAB,
* and calculate its eigen values.
*
*/
a = mxCreateDoubleMatrix(3, 2, mxREAL);
/*
* Copy data from Areal to matrix a
*/
#if MX_HAS_INTERLEAVED_COMPLEX
memcpy(mxGetDoubles(a), Areal, 6*sizeof(double));
#else
memcpy(mxGetPr(a), Areal, 6*sizeof(double));
#endif
engPutVariable(ep, "A", a);
/*
* Calculate the eigen value
*/
engEvalString(ep, "d = eig(A*A')");
/*
* Use engOutputBuffer to capture MATLAB output. Ensure first that
* the buffer is always NULL terminated.
*/
buffer[BUFSIZE] = '\0';
engOutputBuffer(ep, buffer, BUFSIZE);
/*
* the evaluate string returns the result into the
* output buffer.
*/
engEvalString(ep, "whos");
MessageBox ((HWND)NULL, (LPSTR)buffer, (LPSTR) "MATLAB - whos", MB_OK);
/*
* Get the eigen value mxArray
*/
d = engGetVariable(ep, "d");
engClose(ep);
if (d == NULL) {
MessageBox ((HWND)NULL, (LPSTR)"Get Array Failed", (LPSTR)"Engwindemo.c", MB_OK);
}
else {
/*
* Using interleaved complex representation we can access complex number
* with a single pointer instead of using two separate pointers.
*/
#if MX_HAS_INTERLEAVED_COMPLEX
if (mxIsComplex(d)) {
sprintf(buffer,"Eigenval 2: %g+%gi",mxGetComplexDoubles(d)[1].real,mxGetComplexDoubles(d)[1].imag);
}
else {
sprintf(buffer,"Eigenval 2: %g",mxGetDoubles(d)[1]);
}
#else
Dreal = mxGetPr(d);
Dimag = mxGetPi(d);
if (Dimag) {
sprintf(buffer,"Eigenval 2: %g+%gi",Dreal[1],Dimag[1]);
}
else {
sprintf(buffer,"Eigenval 2: %g",Dreal[1]);
}
#endif
MessageBox ((HWND)NULL, (LPSTR)buffer, (LPSTR)"Engwindemo.c", MB_OK);
mxDestroyArray(d);
}
/*
* We're done! Free memory, close MATLAB engine and exit.
*/
mxDestroyArray(T);
mxDestroyArray(a);
return(0);
}
/* LocalWords: eigen eng Eigenval gi
*/
Linux または macOS での C からの MATLAB エンジン関数の呼び出し
次の C コードでは、Linux® または macOS システムで C プログラムから MATLAB エンジン関数を呼び出す方法を示します。
/*
* engdemo.c
*
* A simple program to illustrate how to call MATLAB
* Engine functions from a C program.
*
* Copyright 1984-2016 The MathWorks, Inc.
* All rights reserved
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "engine.h"
#define BUFSIZE 256
int main()
{
Engine *ep;
mxArray *T = NULL, *result = NULL;
char buffer[BUFSIZE+1];
double time[10] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0 };
/*
* Call engOpen with a NULL string. This starts a MATLAB process
* on the current host using the command "matlab".
*/
if (!(ep = engOpen(""))) {
fprintf(stderr, "\nCan't start MATLAB engine\n");
return EXIT_FAILURE;
}
/*
* PART I
*
* For the first half of this demonstration, send data
* to MATLAB, analyze the data, and plot the result.
*/
/*
* Create a variable for the data
*/
T = mxCreateDoubleMatrix(1, 10, mxREAL);
memcpy((void *)mxGetPr(T), (void *)time, sizeof(time));
/*
* Place the variable T into the MATLAB workspace
*/
engPutVariable(ep, "T", T);
/*
* Evaluate a function of time, distance = (1/2)g.*t.^2
* (g is the acceleration due to gravity)
*/
engEvalString(ep, "D = .5.*(-9.8).*T.^2;");
/*
* Plot the result
*/
engEvalString(ep, "plot(T,D);");
engEvalString(ep, "title('Position vs. Time for a falling object');");
engEvalString(ep, "xlabel('Time (seconds)');");
engEvalString(ep, "ylabel('Position (meters)');");
/*
* use fgetc() to pause long enough to be
* able to see the plot
*/
printf("Hit return to continue\n\n");
fgetc(stdin);
/*
* We're done for Part I! Free memory, close MATLAB figure.
*/
printf("Done for Part I.\n");
mxDestroyArray(T);
engEvalString(ep, "close;");
/*
* PART II
*
* For the second half of this demonstration, we will request
* a MATLAB string, which should define a variable X. MATLAB
* will evaluate the string and create the variable. We
* will then recover the variable, and determine its type.
*/
/*
* Use engOutputBuffer to capture MATLAB output, so we can
* echo it back. Ensure first that the buffer is always NULL
* terminated.
*/
buffer[BUFSIZE] = '\0';
engOutputBuffer(ep, buffer, BUFSIZE);
while (result == NULL) {
char str[BUFSIZE+1];
char *input = NULL;
/*
* Get a string input from the user
*/
printf("Enter a MATLAB command to evaluate. This command should\n");
printf("create a variable X. This program will then determine\n");
printf("what kind of variable you created.\n");
printf("For example: X = 1:5\n");
printf(">> ");
input = fgets(str, BUFSIZE, stdin);
/*
* Evaluate input with engEvalString
*/
engEvalString(ep, str);
/*
* Echo the output from the command.
*/
printf("%s", buffer);
/*
* Get result of computation
*/
printf("\nRetrieving X...\n");
if ((result = engGetVariable(ep,"X")) == NULL)
printf("Oops! You didn't create a variable X.\n\n");
else {
printf("X is class %s\t\n", mxGetClassName(result));
}
}
/*
* We're done! Free memory, close MATLAB engine and exit.
*/
printf("Done!\n");
mxDestroyArray(result);
engClose(ep);
return EXIT_SUCCESS;
}
バージョン履歴
R2006a より前に導入
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)
