C++ クライアントの作成
この例では、C クライアント API を使用して MATLAB® Production Server™ クライアントを記述する方法を説明します。クライアント アプリケーションは、Production Server コンパイラ アプリを使用したデプロイ可能なアーカイブのパッケージ化 (MATLAB Compiler SDK)でコンパイルしMATLAB Production Server へのアーカイブのデプロイでデプロイした関数 addmatrix
を呼び出します。
C++ の MATLAB Production Server クライアント アプリケーションを作成します。
addmatrix_client.cpp
というファイルを作成します。テキスト エディターを使用して、
addmatrix_client.cpp
を開きます。次の include ステートメントをファイルに追加します。
#include <iostream> #include <mps/client.h>
メモ
MATLAB Production Server C クライアント API のヘッダー ファイルは、
フォルダーにあります。ここで、$MPS_INSTALL
/client/c/include/mps$MPS_INSTALL
は MATLAB Production Server がインストールされているルート フォルダーです。main()
メソッドをアプリケーションに追加します。int main ( void ) { }
クライアント ランタイムを初期化します。
mpsClientRuntime* mpsruntime = mpsInitializeEx(MPS_CLIENT_1_1);
クライアントの構成を作成します。
mpsClientConfig* config; mpsStatus status = mpsruntime->createConfig(&config);
クライアントのコンテキストを作成します。
mpsClientContext* context; status = mpsruntime->createContext(&context, config);
関数に入力する MATLAB データを作成します。
double a1[2][3] = {{1,2,3},{3,2,1}}; double a2[2][3] = {{4,5,6},{6,5,4}}; int numIn=2; mpsArray** inVal = new mpsArray* [numIn]; inVal[0] = mpsCreateDoubleMatrix(2,3,mpsREAL); inVal[1] = mpsCreateDoubleMatrix(2,3,mpsREAL); double* data1 = (double *)( mpsGetData(inVal[0]) ); double* data2 = (double *)( mpsGetData(inVal[1]) ); for(int i=0; i<2; i++) { for(int j=0; j<3; j++) { mpsIndex subs[] = { i, j }; mpsIndex id = mpsCalcSingleSubscript(inVal[0], 2, subs); data1[id] = a1[i][j]; data2[id] = a2[i][j]; } }
出力を保持する MATLAB データを作成します。
int numOut = 1; mpsArray **outVal = new mpsArray* [numOut];
デプロイされた MATLAB 関数を呼び出します。
以下を引数として指定します。
クライアントのコンテキスト
関数の URL
予期される出力の数
出力を保持する
mpsArray
へのポインター入力の数
入力を保持する
mpsArray
へのポインター
mpsStatus status = mpsruntime->feval(context, "http://localhost:9910/addmatrix/addmatrix", numOut, outVal, numIn, (const mpsArray**)inVal);
関数
feval
の詳細については、
フォルダーにあるリファレンス資料を参照してください。ここで、$MPS_INSTALL
/client$MPS_INSTALL
は MATLAB Production Server インストール フォルダーの名前です。if
ステートメントを使用して、関数呼び出しが成功していることを確認します。if (status==MPS_OK) { }
if
ステートメント内に、出力を処理するコードを追加します。double* out = mpsGetPr(outVal[0]); for (int i=0; i<2; i++) { for (int j=0; j<3; j++) { mpsIndex subs[] = {i, j}; mpsIndex id = mpsCalcSingleSubscript(outVal[0], 2, subs); std::cout << out[id] << "\t"; } std::cout << std::endl; }
エラーを処理するために、
if
ステートメントにelse
句を追加します。else { mpsErrorInfo error; mpsruntime->getLastErrorInfo(context, &error); std::cout << "Error: " << error.message << std::endl; switch(error.type) { case MPS_HTTP_ERROR_INFO: std::cout << "HTTP: " << error.details.http.responseCode << ": " << error.details.http.responseMessage << std::endl; case MPS_MATLAB_ERROR_INFO: std::cout << "MATLAB: " << error.details.matlab.identifier << std::endl; std::cout << error.details.matlab.message << std::endl; case MPS_GENERIC_ERROR_INFO: std::cout << "Generic: " << error.details.general.genericErrorMsg << std::endl; } mpsruntime->destroyLastErrorInfo(&error); }
入力で使用されたメモリを解放します。
for (int i=0; i<numIn; i++) mpsDestroyArray(inVal[i]); delete[] inVal;
出力で使用されたメモリを解放します。
for (int i=0; i<numOut; i++) mpsDestroyArray(outVal[i]); delete[] outVal;
クライアント ランタイムで使用されたメモリを解放します。
mpsruntime->destroyConfig(config); mpsruntime->destroyContext(context); mpsTerminate();
ファイルを保存します。
完了したプログラムは次のようになります。
#include <iostream> #include <mps/client.h> int main ( void ) { mpsClientRuntime* mpsruntime = mpsInitializeEx(MPS_CLIENT_1_1); mpsClientConfig* config; mpsStatus status = mpsruntime->createConfig(&config); mpsClientContext* context; status = mpsruntime->createContext(&context, config); double a1[2][3] = {{1,2,3},{3,2,1}}; double a2[2][3] = {{4,5,6},{6,5,4}}; int numIn=2; mpsArray** inVal = new mpsArray* [numIn]; inVal[0] = mpsCreateDoubleMatrix(2,3,mpsREAL); inVal[1] = mpsCreateDoubleMatrix(2,3,mpsREAL); double* data1 = (double *)( mpsGetData(inVal[0]) ); double* data2 = (double *)( mpsGetData(inVal[1]) ); for(int i=0; i<2; i++) { for(int j=0; j<3; j++) { mpsIndex subs[] = { i, j }; mpsIndex id = mpsCalcSingleSubscript(inVal[0], 2, subs); data1[id] = a1[i][j]; data2[id] = a2[i][j]; } } int numOut = 1; mpsArray **outVal = new mpsArray* [numOut]; status = mpsruntime->feval(context, "http://localhost:9910/addmatrix/addmatrix", numOut, outVal, numIn, (const mpsArray **)inVal); if (status==MPS_OK) { double* out = mpsGetPr(outVal[0]); for (int i=0; i<2; i++) { for (int j=0; j<3; j++) { mpsIndex subs[] = {i, j}; mpsIndex id = mpsCalcSingleSubscript(outVal[0], 2, subs); std::cout << out[id] << "\t"; } std::cout << std::endl; } } else { mpsErrorInfo error; mpsruntime->getLastErrorInfo(context, &error); std::cout << "Error: " << error.message << std::endl; switch(error.type) { case MPS_HTTP_ERROR_INFO: std::cout << "HTTP: " << error.details.http.responseCode << ": " << error.details.http.responseMessage << std::endl; case MPS_MATLAB_ERROR_INFO: std::cout << "MATLAB: " << error.details.matlab.identifier << std::endl; std::cout << error.details.matlab.message << std::endl; case MPS_GENERIC_ERROR_INFO: std::cout << "Generic: " << error.details.general.genericErrorMsg << std::endl; } mpsruntime->destroyLastErrorInfo(&error); } for (int i=0; i<numIn; i++) mpsDestroyArray(inVal[i]); delete[] inVal; for (int i=0; i<numOut; i++) mpsDestroyArray(outVal[i]); delete[] outVal; mpsruntime->destroyConfig(config); mpsruntime->destroyContext(context); mpsTerminate(); }
アプリケーションをコンパイルします。
クライアント コードをコンパイルするには、コンパイラから
client.h
にアクセスできなければなりません。このヘッダー ファイルは$MPSROOT/client/c/include/mps/
に保存されています。アプリケーションをリンクするには、リンカーから
$MPSROOT/client/c/<arch>/lib/
に保存されている次のファイルにアクセスできなければなりません。リンクに必要なファイル
Windows® UNIX®/Linux Mac OS X $arch\lib\mpsclient.lib
$arch/lib/libprotobuf3.so
$arch/lib/libprotobuf3.dylib
$arch/lib/libcurl.so
$arch/lib/libcurl.dylib
$arch/lib/libmwmpsclient.so
$arch/lib/libmwmpsclient.dylib
$arch/lib/libmwcpp11compat.so
アプリケーションを実行します。
アプリケーションを実行するには、
$MPSROOT/client/c/<arch>/lib/
に保存されている次のファイルをアプリケーションのパスに追加します。実行に必要なファイル
Windows UNIX/Linux Mac OS X $arch\lib\mpsclient.dll
$arch/lib/libprotobuf3.so
$arch/lib/libprotobuf3.dylib
$arch\lib\libprotobuf3.dll
$arch/lib/libcurl.so
$arch/lib/libcurl.dylib
$arch\lib\libcurl.dll
$arch/lib/libmwmpsclient.so
$arch/lib/libmwmpsclient.dylib
$arch/lib/libmwcpp11compat.so
クライアントは、サーバー インスタンス上の関数
addmatrix
を呼び出し、コンソールに次の行列を返します。5.0 7.0 9.0 9.0 7.0 5.0