作成したアプリケーションのデータが変更されない
Show older comments
アプリケーションの作成についてよくわかりません。
ある学習データ(data.csvとして同じフォルダ内に配置)を基に新しいデータの予測をするソースコードをMATLAB上で作成しています。
このソースコードをアプリケーションコンパイラでアプリケーションにし、動作させた場合に、data.csvを変更しても、元のdata.csvに従って計算する場合があります。アプリケーションの中にdata.csvが残っていて、変更しても元のdata.csvを使っているとしか思えないのですが、そういうことは起こりうるのでしょうか。
ちなみに、MATLAB上で動作させると、フォルダ内のdata.csvを変更すると、変更されたdata.csvで計算されます。
コンパイル時に、コンパイルの仕方でアプリケーション内部にデータが残ったりすることがあるのでしょうか。やり方がまずいのでしょうか。
MATLAB上で計算させて確認後、ワークスペースのクリア後にコンパイルしてその後データ変更を行っても元のデータが残っているようです。
漠然としておりますが、ソースが大きすぎて開示するのが困難なので、口頭での説明にて失礼いたします。
Answers (1)
Kojiro Saito
on 9 Sep 2020
0 votes
実行時にMATLAB Runtimeのキャッシュフォルダにdata.csvが置かれるのですが、それが残ってしまって、手元のデータを変更しても反映されていないのかもしれません。
MATLAB Runtimeのキャッシュフォルダは
Windowsの場合、
C:\Users\USERNAME\AppData\Local\Temp\USERNAME\mcrCacheX.X\FUNCTIONNAME\FUNCTIONNAME
Linuxの場合、
/home/USERNAME/.mcrCacheX.X/FUNCTIONNAME/FUNCTIONNAME
になります。
例えば、R2019bの場合、MATALB Runtimeのバージョンは9.7なので、addmatrix.exeを実行すると
C:\Users\USERNAME\AppData\Local\Temp\USERNAME\mcrCache9.7\addmat0\addmatrix
のようにキャッシュフォルダが作られます。
この中にdata.csvが置かれていて、手元のファイルを変更しても、変更が反映されないことがあります。
対処方法としては、一旦data.csvをデスクトップに移動するなどしてMATLABのパス上にない場所に移動させ、アプリケーションコンパイラでコンパイルし、コンパイルが終わったらexeと同じフォルダにdata.csvを置く、などの方法があります。
もしMATLABのバージョンR2020aを使えるなら、ファイルをパッケージに含まないようにするオプションが出ましたので、
mファイルに %#exclude data.csv というプラグマを付けることでコンパイル時にdata.csvが除外されます。
7 Comments
HIronori Kamachi
on 9 Sep 2020
Kojiro Saito
on 9 Sep 2020
キャッシュフォルダの中にあるdata.csvを変更すれば反映されると思います。
キャッシュフォルダを削除し、もう一度EXEを実行すると、開発環境でパッケージに含められたdata.csvが再度解凍されて置かれてしまうので、うまく反映されないかと。
計算に必要なmスクリプトやデータファイルは、アプリケーションコンパイラでメインのmファイルから依存関係が判定され、自動的に含められるようになっています。もし「アプリケーションの実行に必要なファイル」に含まれていなかったら、手動で追加する必要があります。データファイルを配布先で変更する必要がある場合は、コンパイル時に含めないよう移動させておく必要があります。
HIronori Kamachi
on 10 Sep 2020
Kojiro Saito
on 10 Sep 2020
ご連絡ありがとうございます。
コンパイル後の実行ファイルをデバッグする際には、ランタイム追加設定でログ出力を有効にしておくとdispの出力結果や、警告、エラーなどがログに出力されるようになります。合わせてご活用いただければと思います。

HIronori Kamachi
on 16 Sep 2020
Kojiro Saito
on 17 Sep 2020
Edited: Kojiro Saito
on 17 Sep 2020
こちらを読んで原因がわかりました。
データ ファイルの依存関係
上記の実行可能コンテンツに加え、MATLAB Compiler は、次の任意の関数を呼び出して、MATLAB 関数がアクセスするファイルの検出と自動インクルードを行うことができます。audioinfo、audioread、csvread、daqread、dlmread、fileread、fopen、imfinfo、importdata、imread、load、matfile、mmfileinfo、open、readtable、type、VideoReader、xlsfinfo、xlsread、xmlread、xslt。
コンパイラ アプリを使用している場合、これらのデータ ファイルはアプリの [アプリケーションの実行に必要なファイル] 領域に自動的に追加されます。
dlmreadでは、csvやtxt、matなどのファイルが自動的に「アプリケーションの実行に必要なファイル」に取り込まれます。
dlmreadの例
function testDlmRead
m = dlmread('mydata.txt');
disp(m)
end
アプリケーションコンパイルでコンパイルした時

ただ、readmatrixは上記のドキュメントの関数一覧に無いので、入力ファイルが「アプリケーションの実行に必要なファイル」に取り込まれません。
readmatrixの例
function testReadMatrix
m = readmatrix('mydata.txt');
disp(m)
end
アプリケーションコンパイルでコンパイルした時
アプリケーションの実行に必要なファイルに何も含まれません。

ですので、入力ファイルを変更した場合、readmatrixではコンパイルしたアプリケーションが新しいファイルを読み込みますが、dlmreadではコンパイルしたアプリケーションに入力ファイルが含まれてしまっているので、新しいファイルが反映されない、という挙動の違いになります。
HIronori Kamachi
on 18 Sep 2020
Categories
Find more on MATLAB Compiler 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!