В этом примере показано, как записать клиент MATLAB ® Production Server™ с помощью API клиента C. Клиентское приложение вызывает addmatrix функция, скомпилированная в Package Deployable Archives with Production Server Compiler App и развернутая в Share Deployable Archive (MATLAB Production Server).
Создайте клиентское приложение C++ MATLAB Production Server:
Создание файла с именем addmatrix_client.cpp.
Используя текстовый редактор, откройте addmatrix_client.cpp.
Добавьте в файл следующие инструкции include:
#include <iostream> #include <mps/client.h>
Примечание
Файлы заголовков для API клиента MATLAB Production Server C находятся в папка. папка.matlabroot/toolbox/compiler_sdk/mps_client/c/include/mps
Добавить 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 см. справочный материал, включенный в папка.matlabroot/toolbox/compiler_sdk/mps_client
Проверка успешности вызова функции с помощью 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;
}Добавить else предложение к if для обработки любых ошибок.
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. Этот файл заголовка хранится в .matlabroot/toolbox/compiler_sdk/mps_client/c/include/mps/
Чтобы связать приложение, компоновщику необходим доступ к следующим файлам, хранящимся в : matlabroot/toolbox/compiler_sdk/mps_client/c/
Файлы, необходимые для связывания
| Windows ® | UNIX ®/Linux | Mac OS X |
|---|---|---|
$arch\lib\mpsclient.lib | $arch/lib/libprotobuf.so | $arch/lib/libprotobuf.dylib |
$arch/lib/libcurl.so | $arch/lib/libcurl.dylib | |
$arch/lib/libmwmpsclient.so | $arch/lib/libmwmpsclient.dylib | |
$arch/lib/libmwcpp11compat.so |
Запустите приложение.
Чтобы запустить приложение, добавьте следующие файлы, хранящиеся в к пути приложения: matlabroot/toolbox/compiler_sdk/mps_client/c/
Файлы, необходимые для выполнения
| Windows | UNIX/Linux | Mac OS X |
|---|---|---|
$arch\lib\mpsclient.dll | $arch/lib/libprotobuf.so | $arch/lib/libprotobuf.dylib |
$arch\lib\libprotobuf.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