メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

パッケージ化されたアプリケーションでのファイルの追加とアクセス

R2026a

MATLAB® スクリプト ファイルに加えて、データ ファイル、DLL、および他のプログラミング言語のファイルなど、他のタイプのファイルをデプロイ可能なアーカイブに追加できます。関数 which を使用するか、デプロイ可能なアーカイブのルート ctfroot を基準としたファイルの場所を参照して、デプロイしたコードから追加ファイルにアクセスできます。

デプロイ可能なアーカイブの詳細については、デプロイ可能なアーカイブについてを参照してください。

デプロイ可能なアーカイブにファイルを含める

MATLAB Compiler™ は依存関係の分析関数を使用して、生成されるパッケージに含める必要なファイルのリストを決定します。詳細については、MATLAB Compiler を使用した依存関係の分析を参照してください。

mcc コマンドで -a フラグを使用するか、compiler.build.standaloneApplication のように関数 compiler.build を使用した 'AdditionalFiles' オプションで、デプロイ可能なアーカイブに追加ファイルを含めることができます。

あるいは、コンパイラ アプリの [カスタム要件] セクションにファイルを追加することもできます。

%#function プラグマを使用して MATLAB データ ファイルを明示的に含める

既定では、コンパイラは依存関係の分析中に MATLAB データ ファイル (MAT ファイル) を除外します。データ ファイルを手動で追加すると、それらを含めることができます。

コンパイラで MAT ファイル内のデータを明示的に調べる場合、MATLAB コードを記述するときに %#function プラグマを指定します。

たとえば、MAT ファイルから読み込まれた ClassificationSVM クラスへの依存関係を含める場合は、%#function プラグマを使用します。

function foo 
    %#function ClassificationSVM 
        load('svm-classifier.mat');
        num_dimensions = size(svm_model.PredictorNames, 2);
end %function foo

MEX ファイル、DLL、共有ライブラリを含める

MEX ファイルを含んでいる MATLAB 関数をコンパイルする場合は、依存関係の分析プロセスによる検索が可能であることを確認してください。特に次の点に注意してください。

  • 依存関係の分析関数では、MEX ファイル、DLL または共有ライブラリを調べて依存関係を判定することができないため、これらのファイルに必要なすべての実行可能ファイルは明示的に含めてください。

  • MEX ファイル、DLL、共有ライブラリによって呼び出された MATLAB 関数を、依存関係の分析中に検索できるかどうかわからない場合は、手動で含めてください。

  • コンパイラと互換性がない関数もあります。ビルドが完了したら、ファイル mccExcludedFiles.log を確認してください。このファイルには、デプロイできないアプリケーションから呼び出されたすべての関数がリストされています。

デプロイした関数からのファイルへのアクセス

デプロイした MATLAB コードからファイルにアクセスするには、isdeployed を使用して、コードがデプロイ モードで実行されているかどうかをチェックします。次に、関数 which を使用するか、ctfroot を基準としたファイルの場所を指定して、ファイルを特定します。

関数 which の使用

ファイルへのパスを取得する最も簡単な方法は、関数 which を使用してファイルを特定することです。

if isdeployed
    locate_externapp = which('extern_app.exe');
end
関数 which は、デプロイ可能なアーカイブ内にあれば、ファイル extern_app.exe へのパスを返します。

ctfroot でのファイルの場所の指定

現在の MATLAB 作業フォルダー以外のフォルダーにあるファイルを含めると、ファイルの部分パスは ctfroot を基準としたデプロイ可能なアーカイブに保持されます。

  • 現在の MATLAB 作業フォルダーまたはサブフォルダー内のファイルは、現在のフォルダーからファイルへの相対パスを保持します。

    たとえば、パッケージ化中に MATLAB で開くフォルダーが D:\Documents\Work\MyProj の場合、ファイル D:\Documents\Work\MyProj\exfiles\data1.mat はデプロイ可能なアーカイブの ctfroot\mfilename\exfiles\data1.mat に配置されます。ここで、mfilename はメインの MATLAB スクリプト ファイルの名前であり、12 文字に切り捨てられます。

  • 現在の作業フォルダー外にあるファイルは、ディスク ドライブのルートから完全なフォルダー構造を保持します。

    たとえば、ファイル C:\Users\mwuser\Documents\External\externdata\extern_app.exe はデプロイ可能なアーカイブの ctfroot\Users\mwuser\Documents\External\externdata\extern_app.exe に配置されます。

関数 fullfile を使用し、ファイル パスでシステムの正しいファイル区切りが使用されていることを確認してください。

if isdeployed
    locate_data1 = fullfile(ctfroot,'exfiles','data1.mat');
    locate_data2 = fullfile(ctfroot,'Users','mwuser','Documents',...
        'External','externdata','extern_app.exe');
end

デプロイされたアプリケーションの MATLAB データの処理例

この例では、データ ファイルをパッケージ化されたアプリケーション内に含めて、関数 load と save を使用して MATLAB データを操作する方法を説明します。

  1. MATLAB の作業フォルダーに移動します。この例での作業フォルダーは C:\Users\mwuser\Documents\Work\exfiles です。

  2. MATLAB に付属している Data_Handling フォルダーと externdata フォルダーを作業フォルダーにコピーします。

    copyfile(fullfile(matlabroot,'extern','examples','compiler','Data_Handling'),'Data_Handling');
    copyfile(fullfile(matlabroot,'extern','examples','compiler','externdata'),'externdata');

    MATLAB コマンド プロンプトで、作業フォルダー内の新しい Data_Handling フォルダーに移動します。

  3. ex_loadsave.m を調べます。

    ex_loadsave スクリプトは、それぞれ異なるフォルダーに配置されている 3 つの MATLAB データ ファイルを読み込みます。

    • user_data.mat — 現在のフォルダー

    • userdata\extra_data.mat — 現在のフォルダーのサブフォルダー

    • ..\externdata\extern_data.mat — 現在のフォルダー以外

    function ex_loadsave
    % This example shows how to work with the "load/save" functions
    % on data files in deployed mode. This example contains three
    % source data files.
    %    user_data.mat 
    %    userdata/extra_data.mat 
    %    ../externdata/extern_data.mat
    %
    % Compile this example with mcc command: 
    %     mcc -m ex_loadsave.m -a 'user_data.mat'
    %         -a './userdata/extra_data.mat'
    %         -a '../externdata/extern_data.mat'
    %
    % In this example, the output data file is written to the path:
    %	output/saved_data.mat
    % relative to the application's run time current working directory.
    % When writing data files to local disk, do not save any files under $ctfroot,
    % as $ctfroot may be deleted and/or refreshed for each application run.
    %
    %==== load data file =============================
    if isdeployed
        % In deployed mode, all files in or under the main file's directory
        % may be loaded by full path, by path relative to ctfroot, or by
        % filename only, since their directories are on the MATLAB path.
        % Here we load 'user_data.mat' by full path.
        LOADFILENAME1=which(fullfile(ctfroot,mfilename,'user_data.mat'));    
        % These alternate methods also work:
        % LOADFILENAME1=which(fullfile(mfilename,'user_data.mat'));    
        % LOADFILENAME1=which(fullfile('user_data.mat'));
    
        % Here we load 'extra_data.mat' by relative path:
        LOADFILENAME2=which(fullfile('userdata','extra_data.mat'));
        % These alternate methods also work:
        % LOADFILENAME2=which(fullfile(ctfroot,'userdata','extra_data.mat'));
        % LOADFILENAME2=which(fullfile('extra_data.mat'));
    
        % For a data file external to the main MATLAB file's directory tree,
        % its full compile time path is appended to $ctfroot, so it is
        % best to simply load it by filename (since it is on the path):
        LOADFILENAME3=which(fullfile('extern_data.mat'));
    else
        %running the code in MATLAB
        LOADFILENAME1=fullfile(pwd,'user_data.mat');
        LOADFILENAME2=fullfile(pwd,'userdata','extra_data.mat');
        LOADFILENAME3=fullfile(pwd,'..','externdata','extern_data.mat');
    end
    
    % Load the data file from current working directory
    disp(['Load A from : ',LOADFILENAME1]);
    load(LOADFILENAME1,'data1');
    disp('A= ');
    disp(data1);
    
    % Load the data file from subdirectory
    disp(['Load B from : ',LOADFILENAME2]);
    load(LOADFILENAME2,'data2');
    disp('B= ');
    disp(data2);
    
    % Load extern data outside of current working directory
    disp(['Load extern data from : ',LOADFILENAME3]);
    load(LOADFILENAME3);
    disp('ext_data= ');
    disp(ext_data);
    
    %==== multiply two data matrices together ==============
    result = data1*data2;
    disp('A * B = ');
    disp(result);
    
    %==== save the new data to a new file ===========
    SAVEPATH=strcat(pwd,filesep,'output');
    if ( ~isdir(SAVEPATH))
        mkdir(SAVEPATH);
    end
    SAVEFILENAME=strcat(SAVEPATH,filesep,'saved_data.mat');
    disp(['Save the A * B result to : ',SAVEFILENAME]);
    save(SAVEFILENAME, 'result');
  4. データ ファイルをリストする cell 配列を作成します。

    datafiles = {'user_data.mat','./userdata/extra_data.mat','../externdata/extern_data.mat'};
  5. 関数 compiler.build.standaloneApplication を使用して ex_loadsave.m をコンパイルします。

    compiler.build.standaloneApplication('ex_loadsave.m','AdditionalFiles',datafiles)
  6. コンパイルされたアプリケーションを実行します。

    !ex_loadsavestandaloneApplication\ex_loadsave.exe
    Load A from : C:\Users\mwuser\AppData\Local\Temp\mwuser\mcrCache9.13\ex_loa0\ex_loadsave\user_data.mat 
    A=  
       21.4669   15.7255   15.6930   11.8122 
       19.6691   17.0570   17.4689   22.2803 
       20.3894   17.2548   17.3474   17.7316 
       19.3062   15.1321   16.0573   25.4584 
     
    Load B from : C:\Users\mwuser\AppData\Local\Temp\mwuser\mcrCache9.13\ex_loa0\ex_loadsave\userdata\extra_data.mat 
    B=  
       15.3970   20.5682   13.8388   26.5186 
       14.2255   24.6506   18.9545   24.8117 
       14.9904   22.8211   16.4942   25.3533 
       13.1022   26.0567   21.2197   24.8940 
     
    Load extern data from : C:\Users\mwuser\AppData\Local\Temp\mwuser\mcrCache9.13\ex_loa0\Users\mwuser\Documents\Work\exfiles\externdata\extern_data.mat 
    ext_data=  
       27.6923   69.4829   43.8744   18.6873 
        4.6171   31.7099   38.1558   48.9764 
        9.7132   95.0222   76.5517   44.5586 
       82.3458    3.4446   79.5200   64.6313 
     
    A * B =  
       1.0e+03 * 
     
        0.9442    1.4951    1.1046    1.6514 
        1.0993    1.8042    1.3564    1.9424 
        1.0518    1.7026    1.2716    1.8500 
        1.0868    1.7999    1.3591    1.9283 
     
    Save the A * B result to : C:\Users\mwuser\Documents\Work\exfiles\Data_Handling\output\saved_data.mat
  7. 結果を ex_loadsave.m の出力と比較します。

参考

|

トピック