外部インタフェース/API | ![]() ![]() |
エンジン関数の呼び出しの例題
本節では、CおよびFortranプログラムからエンジン関数を呼び出す方法を説明する例題が含まれています。例題は、以下のトピックスを説明します。
エンジン関数の利用時に行うべき一連の処理を理解することが重要です。たとえば、engPutArray
を実行する前には、行列を作成し、名前を割り当て、要素を設定する必要があります。
これらの例題を見た後で、「エンジンプログラムのコンパイルとリンク」の指示に従って、アプリケーションを構築し、テストしてください。アプリケーションを構築し、実行することによって、システムがエンジンアプリケーションに対して適切に設定されていることが確認されます。
CアプリケーションからのMATLABの呼び出し
このプログラムengdemo.c
は、スタンドアロンCプログラムからエンジン関数を呼び出す方法を記述しています。本プログラムのWindows版は、<matlab>\extern\examples\eng_mat
ディレクトリのengwindemo.c
を参照してください。MAT-ファイルの例題と同様に、エンジンの例題はeng_mat
ディレクトリにあります。
/* $ Revision: 1.6 $ */ /* * engdemo.c * * This is a simple program that illustrates how to call the * MATLAB engine functions from a C program. * * Copyright (c) 1996-2000 The MathWorks, Inc. * */ #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]; double time[10] = { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0 }; /* * Start the MATLAB engine locally by executing the string * "matlab". * * To start the session on a remote host, use the name of * the host as the string rather than \0 * * For more complicated cases, use any string with whitespace, * and that string will be executed literally to start MATLAB. */ if (!(ep = engOpen("\0"))) { fprintf(stderr, "\nCan't start MATLAB engine\n"); return EXIT_FAILURE; } /* * 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 for our data. */ T = mxCreateDoubleMatrix(1, 10, mxREAL); mxSetName(T, "T"); memcpy((void *)mxGetPr(T), (void *)time, sizeof(time)); /* * Place the variable T into the MATLAB workspace. */ engPutArray(ep, 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 make sure that we 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 engine. */ 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. */ engOutputBuffer(ep, buffer, BUFSIZE); while (result == NULL) { char str[BUFSIZE]; /* * 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(">> "); fgets(str, BUFSIZE-1, stdin); /* * Evaluate input with engEvalString. */ engEvalString(ep, str); /* * Echo the output from the command. First two characters * are always the double prompt (>>). */ printf("%s", buffer+2); /* * Get result of computation. */ printf("\nRetrieving X...\n"); if ((result = engGetArray(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; }
このプログラムの最初の部分は、MATLABを起動し、データを送信します。その後MATLABはデータを解析し、結果をプロットします。
Hit return to continue
Done for Part I. Enter a MATLAB command to evaluate. This command should create a variable X. This program will then determine what kind of variable you created. For example: X = 1:5
X = 17.5 X = 17.5000 Retrieving X... X is class double Done!
最後に、プログラムはメモリを開放し、MATLABエンジンをクローズして終了します。
![]() | GUIインテンシブなアプリケーション | FortranアプリケーションからのMATLABの呼び出し | ![]() |