スタンドアロン アプリケーションおよび引数
R2026bMATLAB® 関数をスタンドアロン アプリケーションとしてデプロイすると、オペレーティング システムはコマンド ライン引数を入力として関数に渡します。このトピックでは、コマンド ラインで引数を渡し、MATLAB コード内で処理する方法について説明します。
コマンド ラインで任意のコンソール ベースのアプリケーションに入力引数を渡す場合と同じ方法で、MATLAB Compiler™ を使用して作成されたスタンドアロン アプリケーションに引数を渡すことができます。アプリケーション名に続けて、スペースで区切った 1 つ以上の入力引数を入力します。
スタンドアロン アプリケーションを実行すると、メイン プログラムから "main" 関数 (アプリケーションの作成時に最初にリストした関数) にすべてのコマンド ライン引数が渡されます。既定では、スタンドアロン アプリケーションは入力引数を文字ベクトル入力として受け取ります。アプリケーション コードでは引数データを処理し、必要に応じて別のデータ型に変換する必要があります。デプロイ用コードを記述する際の一般的なガイダンスについては、デプロイ可能な MATLAB コードの記述を参照してください。スタンドアロン アプリケーションを作成する手順については、MATLAB からのスタンドアロン アプリケーションの作成を参照してください。
アプリケーションへのコマンド ライン引数の引き渡し
ファイル、数値または文字、行列、MATLAB 変数など、さまざまなタイプの引数を myapp という名前のスタンドアロン アプリケーションに渡す例について、次の表を参照してください。
| 渡す対象 | 使用する構文 | メモ |
|---|---|---|
helpfile という名前のファイル | myapp path/to/helpfile | ファイルへのパスにスペースが含まれている場合は、パスを二重引用符で囲みます。 |
| 数値または文字 | myapp 1 2 3 a b c | 渡す数値と文字の間にコンマなどの区切りを使用しないでください。 |
| 行列を入力 | myapp "[1 2 3]" "[4 5 6]" | それぞれの行列引数を二重引用符で囲みます。 |
| MATLAB 変数 | MATLAB コマンド ウィンドウで次のように入力: for k=1:10 cmd = ['myapp ',string(k)]; system(cmd); end | 数値の MATLAB 変数を入力としてプログラムに渡すには、変数を文字ベクトルまたは string に変換しなければなりません。 |
スタンドアロン アプリケーションは MATLAB から呼び出すこともできます。以下の例では、MATLAB コマンド ウィンドウで myapp という名前のスタンドアロン アプリケーションに数値と文字 1 2 3 a b c を渡す方法を示します。
system、dos、または unix の使用
system コマンドを使用して、コマンド全体を文字ベクトル (入力引数を含む) として指定します。
system('myapp 1 2 3 a b c')! (感嘆符) 演算子の使用
MATLAB では、! (感嘆符) 演算子を使用します。
!myapp 1 2 3 a b c
! (感嘆符) 演算子を使用する場合、入力行の残りは system コマンドとして解釈されるため、MATLAB 変数を引数として使用することはできません。
Windows バッチ ファイルの使用
引数をもつスタンドアロン アプリケーションをダブルクリックによって実行する場合、入力引数を指定してスタンドアロン アプリケーションを呼び出すバッチ ファイルを作成することができます。たとえば、次のコードで runmyapp.bat を作成します。
rem This is main.bat file which calls
rem myapp.exe with input parameters
myapp "[1 2 3]" "[4 5 6]"
@echo off
pauserunmyapp.bat の最後の 2 行のコードにより、キーが押されるまで、出力を表示しているウィンドウが開いたままになります。
このファイルを保存すると、runmyapp.bat のアイコンをダブルクリックすることにより、上記の引数を使用してコードを実行できます。
MATLAB での入力引数の扱い
スタンドアロン アプリケーションがコマンド ライン引数を受け取ると、MATLAB はそれらを main 関数に渡します。引数は char 値 (文字ベクトル) として渡されます。これには、行列などの数値入力引数が含まれます。引数を処理する前に、関数が想定する型に変換する必要があります。
コードで別の形式のデータ (たとえば double) を想定している場合、MATLAB コードで次のいずれかまたは両方を行う必要があります。
処理前に文字ベクトル入力を MATLAB コードで必要な形式に変換します。たとえば、
string関数とdouble関数を使用して、文字ベクトル入力を数値データに変換できます。compiler.build.standaloneApplicationでTreatInputsAsNumericオプション、スタンドアロン アプリケーション コンパイラ アプリで [アプリへのすべての入力を MATLAB の double の数値として扱います] オプション、またはmcc -nフラグを使用して、数値入力を自動的に MATLAB の double として扱う動作をもつアプリケーションを作成します。パッケージ化オプション間の違いの詳細については、デプロイ オプションの選択を参照してください。
MATLAB コードで入力引数を文字ベクトルに変換する 2 つの方法を次に示します。
方法 1
ischar を使用して、入力引数 z が文字ベクトルであるかどうかをテストし、そうである場合は double 値に変換します。
function [x,y]=foo(z); if ischar(z) z=double(string(z)); else z=z; end x=2*z y=z^2; disp(y)
方法 2
isdeployed は、コードがコンパイル済みアプリケーションとして実行されている場合は true を返し、MATLAB コマンド ウィンドウでは false を返します。isdeployed を使用して、関数がデプロイ モードで実行されているかどうかをテストし、そうである場合は z を double 値に変換します。
function [x,y]=foo(z); if isdeployed z=double(string(z)); end x=2*z y=z^2; disp(y)
可変引数の使用
アプリケーションが受け入れる引数の数が可変である場合、またはビルド時に不明な場合は、varargin を使用します。MATLAB は、引数を varargin cell 配列として main 関数に渡します。
nargin を使用して、少なくとも 1 つの引数が存在することを確認します。isdeployed を使用して、関数がデプロイ モードで実行されているかどうかをテストし、そうである場合は、スカラー数値文字列には str2double、行列式文字列 (たとえば、[1 2 3]) には str2num などの関数を使用して、各引数を明示的に変換します。
function sumUp(varargin) if nargin == 0 disp('Usage: sumUp <num1> <num2> ...'); return; end if isdeployed values = cellfun(@str2double, varargin); else values = [varargin{:}]; end fprintf('Sum: %g\n', sum(values)); end
明示的に変換する代わりに、数値入力を自動的に MATLAB double として扱うアプリケーションを作成できます。
MATLAB ファイルを使用した画面へのデータの表示
スタンドアロン アプリケーションからユーザーに値を直接返すことはできません。コンパイルされたコードから値を返す唯一の方法は、画面に表示するか、ファイルに保存するかのどちらかです。既定では、デプロイされたアプリケーションは、標準出力および標準エラー ストリームにテキストを出力します。
画面にデータを表示するには、次のいずれかを行います。
たとえば、入力 string におけるアルファベットの各文字の出現回数のヒストグラムをプロットするプログラムを作成します。関数は単一の入力を受け取り、出力はゼロです。
function freq(msg) % Remove spaces msg(msg == ' ') = []; % Convert to lower case, and map the letters to numbers. % a=1, b=2, etc. msg = lower(msg) - double('a') + 1; % Map non-letter characters to zero. msg(msg < 1) = 0; msg(msg > 26) = 0; % Display a histogram of the letter frequency in the message. count = hist(msg, 27); bar(0:26, count); labels = char([double('@'), double('a'):double('z')])'; set(gca, 'XTick', 0:26+0.5, 'XTickLabel', labels); axis tight
compiler.build.standaloneApplication を使用してスタンドアロン アプリケーションを作成します。
compiler.build.standaloneApplication('freq.m',Verbose=true);MATLAB コマンド ウィンドウでアプリケーションをテストします。
!freq "The quick brown fox jumps over the lazy dog!"
参考
compiler.build.standaloneApplication | スタンドアロン アプリケーション コンパイラ | mcc