LinuxでMatLabとC ++を友達にした方法



卒業証書の時間は過ぎたので、その実装のレシピを共有したいと思います。 だから、トピックは複雑で、時間が尽きており、最初からすべてを書いたり、既製のライブラリを探したりすることは、特に私にとってシステムの速度が重要であり、左利きのライブラリからのトリックを期待できるので、大きな望みではありません。

私は長く考えなかったと言って、次の結論に達しました。

  1. オペレーティングシステム-あまり考える必要はありませんでした。 私はDebianのファンです(ところで、私のソリューションはWindowsに移植することもできます)。
  2. 将来のプログラムのインターフェースはC ++、Qtです。
  3. プログラムロジックはMatLabです。






準備する





システムが機能するには、次のコンポーネントが必要です。

  1. いわゆるMATLAB Compiler Runtime 。 これは、MatLabダイナミックライブラリの無料スイートです。 公式サイトからダウンロードして、あなたの裁量で使用できます。
  2. 実際にQt。 Linuxリポジトリまたは公式サイトからダウンロードされます




設置





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のインストールの最終段階で書き込まれますが、コピーすることはお勧めしません。手動ですべてを再確認して書き換えることをお勧めします(問題はわかりませんが、2つの異なるマシンでは、これらのパスの愚かなコピーは機能しませんでした)。 また、インストール後、別の方法があります:/ usr / local / MATLAB / MATLAB_Compiler_Runtime / v716 / sys / os / glnxa64、処方することはお勧めしません: その後、すべてのプログラムは起動を拒否し、それなしではすべて正常に動作します。



MatLabを明らかにする





これで、将来のアプリケーションのロジックを作成できます。 新しいmファイルを作成し、新しい関数を作成します。 関数は単純です:転送された2つの数値配列を要約します。

 function [out] = SUM(in1, in2) out = in1 + in2; end
      
      





この関数を動的ライブラリにコンパイルする準備はすべて整っています。

  1. MatLabコンソールに記述します:deploytool。
  2. 開いたウィンドウで、プロジェクトの名前と場所を入力し、ドロップダウンリストから[C共有ライブラリ]を選択して[OK]をクリックします。 Linuxでは、ライブラリ名はlibという単語で始まるため、プロジェクトの名前はlibsum.prjである必要があります。
  3. [エクスポートされた関数]ウィンドウで、[ファイルの追加]をクリックし、新しく作成された関数を追加します。
  4. [ビルド]ボタンをクリックし、コンパイルが完了するまで待ちます。


コンパイル後、distribフォルダーはプロジェクトフォルダーに配置され、そこにライブラリとヘッダーファイルが配置されます。

これで、MatLabでの作業が完了しました。



Qtを明らかにする



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; }
      
      







以上です。 実行できます。

結論



卒業証書が完成し、プログラムが機能している、私は幸せな情報技術エンジニアです。 すべてが良いとバラ色のようですが、いくつかのニュアンスがあります:

  1. MCRアーカイブのサイズは874 MBです。
  2. プログラムを開始した後、MatLabライブラリはロードを開始し、これにより起動が数秒遅れます。


確かに、プラスもあります:

  1. サイド関数の最適化とそれらのエラーのキャッチを心配することなく、メインの作業に集中できます。
  2. MatLab関数の実行速度は、プロジェクトに取り組んで3か月で達成できる速度よりもはるかに高速です。
  3. アプリケーションでMatLabのすべての機能を利用できます。
  4. プロジェクト時間が短縮されます。


興味深い場合は、ニューラルネットワークを使用して音声コマンドをどのように認識したかを書きます。



All Articles