ニューラルネットワークのC++共有ライブラリ化について
Show older comments
feedforwardnet関数をしようして機械学習のプログラムを作成したのですが、これによって出力されたnetworkオブジェクトを使用したプログラムをライブラリコンパイラによってC++共有ライブラリに変換することは可能でしょうか。
現在、MATLABで行った機械学習をC++で利用できるようなプログラムを開発しています。
compiler.build.cppSharedLibrary関数を使用してC++共有ライブラリ化をやろうとしたのですが、networkオブジェクトを呼び出す部分でエラーが発生してしまい、うまくライブラリ化することができませんでした。
ご回答のほうをよろしくお願いします。
2 Comments
Kojiro Saito
on 1 Oct 2023
networkオブジェクトを呼び出すのもC++ライブラリに変換可能(MATLAB Compiler SDKが対応している関数)なので、呼び出し方に何か原因がありそうです。
エラーメッセージと、該当部分のコード抜粋を開示いただけますか?
Hiroki
on 6 Oct 2023
Moved: Kojiro Saito
on 6 Oct 2023
Answers (1)
Kojiro Saito
on 6 Oct 2023
2点あります。
(1) matファイルの読み込み
Call_testing2.mの処理の中でmatファイルを読み込む処理がないため、ANNmethodが存在しないというエラーが出てしまいます。load('ANNmethod.mat')を追加してください。
function K = Call_testing2(Data)
load('ANNmethod.mat')
K=ANNmethod(Data); % ANNmethod.mat 機械学習によって出力された.mat機械学習ファイル
end
入力引数は文字列なので、
compiler.build.cppSharedLibrary(Call_testing2)
ではなく
compiler.build.cppSharedLibrary('Call_testing2.m')
となります。
また、処理に使うmatファイルはcompiler.build.cppSharedLibraryを実行する必要がありません。コンパイルするのは、メインとなる関数(.mファイルまたは.mlxファイル)だけです。
compiler.build.cppSharedLibraryが自動的にファイルの依存関係を見て.matファイルなどをコンパイルに取り込んでくれますが、うまく行かない場合はAdditionalFilesのオプションで手動で追加することもできます。
compiler.build.cppSharedLibrary('Call_testing2.m', 'AdditionalFiles', 'ANNmethod.mat')
コマンドを使わず、GUIからもできます。アプリタブにある「ライブラリコンパイラー」をクリックして、タイプを「C++共有ライブラリ」にし、エクスポートする関数で「'Call_testing2.m」をファイル選択します。「パッケージ化」】ボタンを押せば自動的にコンパイルされます。

8 Comments
Hiroki
on 9 Oct 2023
Kojiro Saito
on 9 Oct 2023
コンパイルして作成された.ctfファイルや.dll、またビルドや実行時に必要なlibMatlabCppSharedLib.libファイルなどはMATLABのライセンスが不要です。
MATLABインストール時にインストールフォルダーに格納されるlicense_agreement.txtというファイルの「Part Two: Deployment Rights 」の「1. Deployment Rights for User Files」などに詳細が書かれています。
.ctfファイルや.dllは配布するもので、libMatlabCppSharedLib.libなどは実行環境にMATLAB Runtimeをインストールすると「<MATLAB Runtimeのインストールフォルダー>\extern\lib\win64」に格納されるファイルを使用しますので、Runtimeの一部です。
Hiroki
on 23 Oct 2023
Kojiro Saito
on 30 Oct 2023
Visual Studioでのインクルードフォルダーやリンカーの設定などがうまくいっていないように思えます。
ドキュメント「サンプル ドライバー ファイルの作成」を参考に、共有ライブラリを呼び出すCPPファイルを作成し、mbuildコマンドでビルドしてVisual Studioで必要な設定を確認してみてください。
compiler.build.cppSharedLibrary('Call_testing2.m', 'AdditionalFiles', 'ANNmethod.mat', 'SampleGenerationFiles', "sample1.m")
sample1.mの例
Data = xxx; % 入力データを何か設定する
K = Call_testing2(Data); % Call_testing2を呼び出す
samplesフォルダーにcppファイル(ファイル名の例:sample1_mda.cpp)が作成されるので、それをmbuildでビルドするとVisual Studioで必要な情報(INCLUDEやLINKLIBSなど)が確認できますので、これをVisual Studioのプロジェクトに設定すれば実現可能です。
mbuild sample1_mda.cpp -v
Hiroki
on 1 Nov 2023
Kojiro Saito
on 1 Nov 2023
エラーメッセージの日本語が文字化けして原因の特定が難しいので、デスクトップコードフォントを「Monospaced」などに変えてエラーが読めるようにしていただけますか。
Hiroki
on 5 Nov 2023
Kojiro Saito
on 6 Nov 2023
- C++共有ライブラリは64bitのみのライブラリのみ作成できます。
- MATLAB CoderでC++に変換することは可能ですが、loadの出力を変数に代入したりgenFunctionでCコード生成に対応する関数を作成したりなどのステップが必要になります。
ただ、追加の質問は本質問の当初の内容から離れてきているので、新規の質問として別スレッドにしたほうが良いです。
Categories
Find more on MATLAB Compiler SDK in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!