Main Content

C++ クライアントの作成

この例では、C クライアント API を使用して MATLAB® Production Server™ クライアントを記述する方法を説明します。クライアント アプリケーションは、Production Server コンパイラ アプリを使用したデプロイ可能なアーカイブのパッケージ化 (MATLAB Compiler SDK)でコンパイルしMATLAB Production Server へのアーカイブのデプロイでデプロイした関数 addmatrix を呼び出します。

C++ の MATLAB Production Server クライアント アプリケーションを作成します。

  1. addmatrix_client.cpp というファイルを作成します。

  2. テキスト エディターを使用して、addmatrix_client.cpp を開きます。

  3. 次の include ステートメントをファイルに追加します。

    #include <iostream>
    #include <mps/client.h>

    メモ

    MATLAB Production Server C クライアント API のヘッダー ファイルは、$MPS_INSTALL/client/c/include/mps フォルダーにあります。ここで、$MPS_INSTALLMATLAB Production Server がインストールされているルート フォルダーです。

  4. main() メソッドをアプリケーションに追加します。

    int main ( void )
    {
    } 
  5. クライアント ランタイムを初期化します。

    mpsClientRuntime* mpsruntime = mpsInitializeEx(MPS_CLIENT_1_1);
  6. クライアントの構成を作成します。

    mpsClientConfig* config;
    mpsStatus status = mpsruntime->createConfig(&config);
  7. クライアントのコンテキストを作成します。

    mpsClientContext* context;
    status = mpsruntime->createContext(&context, config);
  8. 関数に入力する 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];
      }
    }
    
  9. 出力を保持する MATLAB データを作成します。

    int numOut = 1;
    mpsArray **outVal = new mpsArray* [numOut];
  10. デプロイされた 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_INSTALLMATLAB Production Server インストール フォルダーの名前です。

  11. if ステートメントを使用して、関数呼び出しが成功していることを確認します。

    if (status==MPS_OK)
    {
    }
    
  12. 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;
    }
  13. エラーを処理するために、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);
    }
  14. 入力で使用されたメモリを解放します。

    for (int i=0; i<numIn; i++)
      mpsDestroyArray(inVal[i]);
    delete[] inVal;
    
  15. 出力で使用されたメモリを解放します。

    for (int i=0; i<numOut; i++)
      mpsDestroyArray(outVal[i]);
    delete[] outVal;
    
  16. クライアント ランタイムで使用されたメモリを解放します。

    mpsruntime->destroyConfig(config);
    mpsruntime->destroyContext(context);
    mpsTerminate();
    
  17. ファイルを保存します。

    完了したプログラムは次のようになります。

    #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();
    }
  18. アプリケーションをコンパイルします。

    クライアント コードをコンパイルするには、コンパイラから 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  
  19. アプリケーションを実行します。

    アプリケーションを実行するには、$MPSROOT/client/c/<arch>/lib/ に保存されている次のファイルをアプリケーションのパスに追加します。

    実行に必要なファイル

    WindowsUNIX/LinuxMac 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