- PVSM.RU - https://www.pvsm.ru -

Прошла пора дипломов и я хочу поделиться своим рецептом его выполнения. Итак: тема сложная, времени мало, писать все «с нуля» или искать готовые библиотеки — нет большого желания, тем более что мне важна скорость работы системы, а от левых самописных библиотек можно ждать любого подвоха.
Надо сказать что размышлял я недолго и пришел к следующим выводам:
Для работы системы нам необходимы следующие компоненты:
MATLAB Compiler Runtime распространяется в zip архиве. Внутри вы найдете файл install.sh. После его запуска откроется графический инсталятор, который в 3 клика сделает свое дело.
Qt ставится из репозиториев. Если вы скачали свеженькую версию с сайта, то необходимо выполнить следующие действия:
Под рутом:
mkdir /opt/QtSDK
chown %username% /opt/QtSDK
Дальнейшую установку производим обязательно от имени пользователя и в каталог /opt/QtSDK
С установкой закончили, переходим к настройкам:
Необходимо прописать библиотеки в системе, для этого:
echo /usr/local/MATLAB/MATLAB_Compiler_Runtime/v716/runtime/glnxa64 >> /etc/ld.so.conf.d/matlabLibs.conf
echo /usr/local/MATLAB/MATLAB_Compiler_Runtime/v716/sys/os/glnxa64 >> /etc/ld.so.conf.d/matlabLibs.conf
echo /usr/local/MATLAB/MATLAB_Compiler_Runtime/v716/sys/java/jre/glnxa64/jre/lib/amd64/native_threads >> /etc/ld.so.conf.d/matlabLibs.conf
echo /usr/local/MATLAB/MATLAB_Compiler_Runtime/v716/sys/java/jre/glnxa64/jre/lib/amd64/server >> /etc/ld.so.conf.d/matlabLibs.conf
echo /usr/local/MATLAB/MATLAB_Compiler_Runtime/v716/sys/java/jre/glnxa64/jre/lib/amd64 >> /etc/ld.so.conf.d/matlabLibs.conf
ldconfig
И прописать переменную окружения XAPPLRESDIR (необходимы права рута):
export XAPPLRESDIR="/usr/local/MATLAB/MATLAB_Compiler_Runtime/v716/X11/app-defaults"
Далее необходимо скопировать файл: /usr/local/MATLAB/MATLAB_Compiler_Runtime/v716/X11/app-defaults/Matlab в домашнюю директорию пользователя. Вообще, в теории, этого делать не надо, но без этого ничего не работает. Это известный баг, но его пока еще не исправили.
Пройдусь немного по путям к библиотекам:
Да и вообще. Все эти пути будут написаны на финайльной стадии установки MCR, но копировать их я не советую и предлагаю перепроверить и переписать все вручную (не знаю в чем тут дело, но у меня на двух разных машинах тупое копирование этих путей не дало результатов). Также после установки будет еще один путь: /usr/local/MATLAB/MATLAB_Compiler_Runtime/v716/sys/os/glnxa64, его прописывать я не советую: т.к. после этого у меня отказались запускаться все программы, а без него все прекрасно работает.
Теперь можно писать логику будущего приложения. Создаем новый m-файл и пишем новую функцию. Функция у нас будет простая: будем суммировать два переданных массива чисел:
function [out] = SUM(in1, in2)
out = in1 + in2;
end
Все готово для компиляции этой функции в динамическую библиотеку:
После компиляции в папке с проектом окажется папка distrib, в которой и будет находиться наша библиотека и заголовочный файл.
На этом работа с MatLab закончена.
Запускаем Qt и создаем новый проект.
В pro файле прописываем пути к библиотекам и заголовочным файлам:
INCLUDEPATH += /usr/local/MATLAB/MATLAB_Compiler_Runtime/v716/extern/include
LIBS += -L/usr/local/MATLAB/MATLAB_Compiler_Runtime/v716/bin/glnxa64/ -leng -lm
#При условии, что скомпилированная библиотека лежит в каталоге lib создаваемого проекта
LIBS += -L$$PWD/lib/ -lsum
#При условии, что заголовочный файл лежит в каталоге include создаваемого проекта
INCLUDEPATH += $$PWD/include
DEPENDPATH += $$PWD/include
В самом проекте пишем следующией код:
#include <QtCore/QCoreApplication>
#include <libsum.h>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
cout<<"Loading..."<<endl;
if (!libsumInitializeWithHandlers(NULL, 0)){
cout<<"Could not initialize the application."<<endl;
return -1;
}
if (!libsumInitialize()){
cout<<"Could not initialize the library."<<endl;
return -2;
}
mxArray *in1 = mxCreateDoubleMatrix(2, 1, mxREAL);
mxArray *in2 = mxCreateDoubleMatrix(2, 1, mxREAL);
mxArray *out = mxCreateDoubleMatrix(2, 1, mxREAL);
double *i1 = mxGetPr(in1);
double *i2 = mxGetPr(in2);
i1[0] = 1;
i1[1] = 2;
i2[0] = 3;
i2[1] = 4;
if(!mlfSUM(1, &out, in1, in2)){
cout<<"Could not execute function."<<endl;
}
double *res = mxGetPr(out);
cout<<res[0]<<"; "<<res[1]<<endl;
mxDestroyArray(in1);
mxDestroyArray(in2);
mxDestroyArray(out);
cout<<"Terminating..."<<endl;
libsumTerminate();
return 0;
}
Вот и все. Можно запускать.
Диплом выполнен, программа работает, я — счастливый инженер по информационным технологиям. Вроде бы все хорошо и радужно, но есть парочка нюансов:
Правда есть и плюсы:
Если будет интересно напишу как я таким образом распознавал голосовые команды при помощи нейронных сетей.
Автор: Impuls
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/linux/10268
Ссылки в тексте:
[1] MATLAB Compiler Runtime: http://www.mathworks.com/products/compiler/mcr/index.html
[2] с официального сайта.: http://qt.nokia.com/downloads
Нажмите здесь для печати.