Main Content

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

MATLAB コードでの assert ステートメントを使用した入力プロパティの定義

コード生成の場合、関数 assert を使用して、MATLAB® コード内で基本関数入力の型を定義できます。この方法は前提条件と呼ばれています。代わりに、MATLAB コード内で arguments ブロックを使用するか、MATLAB Coder™ アプリを使用するか、コマンド ラインで codegen (MATLAB Coder) に引数 -args を使用して、コード生成の入力の型を指定することもできます。エントリポイント関数の入力のプロパティの指定 (MATLAB Coder)を参照してください。

MATLAB Coder で assert を使用する方法

関数 assert を使用して、基本関数入力のクラス、サイズ、実数/複素数を指定する標準の MATLAB 関数を起動します。

関数 assert を使用して入力プロパティを指定する場合は、以下のいずれかの方法を使用します。提供された正確な構文を使用し、それを変更しないでください。

任意クラスの指定

assert ( isa ( param, 'class_name') )

入力パラメーター param を MATLAB クラス class_name に設定します。たとえば、入力 U のクラスを 32 ビット符号付き整数に設定するには、次の関数を呼び出します。

... 
assert(isa(U,'int32'));
...

fi クラスの指定

assert ( isfi ( param ) )
assert ( isa ( param, 'embedded.fi' ) )

入力パラメーター param を MATLAB クラス fi (固定小数点数値オブジェクト) に設定します。たとえば、入力 U のクラスを fi に設定するには、次の関数を呼び出します。

... 
assert(isfi(U));
...

または

...
assert(isa(U,'embedded.fi'));
...

fi クラスと numerictype の両方を指定しなければなりません。固定小数点入力の numerictype の指定を参照してください。fimath プロパティを設定することもできます (固定小数点入力の fimath の指定を参照)。fimath プロパティを設定しない場合、codegen は MATLAB の既定の fimath 値を使用します。

構造体クラスの指定

assert ( isstruct ( param ) )
assert ( isa ( param, 'struct' ) )

入力パラメーター param を MATLAB クラス struct (構造体) に設定します。たとえば、入力 U のクラスを struct に設定するには、次の関数を呼び出します。

...
assert(isstruct(U));
...

または

...
assert(isa(U, 'struct'));
...

入力パラメーターのクラスを struct に設定する場合は、プロパティが構造体定義に表示されるようにするために、すべてのフィールドのプロパティを指定しなければなりません。

cell 配列クラスの指定

assert(iscell( param))
assert(isa(param, 'cell'))

入力パラメーター param を MATLAB クラス cell (cell 配列) に設定します。たとえば、入力 C のクラスを cell に設定するには、次の関数を呼び出します。

...
assert(iscell(C));
...

または

...
assert(isa(C, 'cell'));
...

cell 配列の要素のプロパティを指定する方法については、cell 配列のプロパティの指定を参照してください。

固定サイズの指定

assert ( all ( size (param) == [dims ] ) )

入力パラメーター param を、次元 dims で指定するサイズに設定します。たとえば、入力 U のサイズを 3 行 2 列の行列に設定するには、次の関数を呼び出します。

...
assert(all(size(U)== [3 2]));
...

スカラー サイズの指定

assert ( isscalar (param ) )
assert ( all ( size (param) == [ 1 ] ) )

入力パラメーター param のサイズをスカラーに設定します。入力 U のサイズをスカラーに設定するには、次の関数を呼び出します。

...
assert(isscalar(U));
...
または
...
assert(all(size(U)== [1]));
...

可変サイズの入力の上限の指定

assert ( all(size(param)<=[N0 N1 ...]));
assert ( all(size(param)<[N0 N1 ...]));

入力パラメーター param の各次元の上限サイズを設定します。入力 U の上限サイズが 3 行 2 列の行列以下になるように設定するには、次の関数を呼び出します。

assert(all(size(U)<=[3 2]));

メモ

coder.varsize を使用して可変サイズの入力の上限を指定することもできます。

固定サイズおよび可変サイズの次元をもつ入力の指定

assert ( all(size(param)>=[M0 M1 ...]));
assert ( all(size(param)<=[N0 N1 ...]));

assert(all(size(param)>=[M0 M1 ...])) を使用して入力パラメーターの各次元の下限サイズを指定する場合、以下の条件があります。

  • 入力パラメーターの各次元の上限サイズも指定しなければならない。

  • 各次元 k の下限 Mk は上限 Nk 以下でなければならない。

  • 固定サイズの次元を指定するには、次元の下限と上限を同じ値に設定する。

  • 制限は非負でなければならない。

入力 U の最初の次元のサイズを 3 に固定し、2 番目の次元を上限 2 の可変サイズに設定するには、次の関数を呼び出します。

assert(all(size(U)>=[3 0]));
assert(all(size(U)<=[3 2]));

個々の次元のサイズの指定

assert (size(param, k)==Nk);
assert (size(param, k)<=Nk);
assert (size(param, k)<Nk);

個々の次元およびすべての次元を同時に指定できます。すべての次元を同時に指定せずに、個々の次元を指定することもできます。以下のルールが適用されます。

  • 少なくとも 1 回は各次元のサイズを指定しなければならない。

  • 最後の次元の指定が前の指定より優先される。

入力パラメーター param の次元 k の上限サイズを設定します。入力 U の最初の次元の上限サイズを 3 に設定するには、次の関数を呼び出します。

assert(size(U,1)<=3)

入力 U の 2 番目の次元のサイズを 2 に固定するには、次の関数を呼び出します。

assert(size(U,2)==2)

実数入力の指定

assert ( isreal (param ) )

入力パラメーター param が実数であることを指定します。入力 U が実数であることを指定するには、次の関数を呼び出します。

...
assert(isreal(U));
...

複素数入力の指定

assert ( ~isreal (param ) )

入力パラメーター param が複素数であることを指定します。入力 U が複素数であることを指定するには、次の関数を呼び出します。

...
assert(~isreal(U));
...

固定小数点入力の numerictype の指定

assert ( isequal ( numerictype ( fiparam ), T ) )

fi 入力パラメーター fiparamnumerictype プロパティを、numerictype オブジェクト T に設定します。たとえば、固定小数点入力 Unumerictype プロパティを、32 ビット ワード長および 30 ビット小数部長をもつ符号付きの numerictype オブジェクト T として指定するには、次のコードを使用します。

%#codegen
...
% Define the numerictype object.
T = numerictype(1, 32, 30);

% Set the numerictype property of input U to T.
assert(isequal(numerictype(U),T));
...

変数に numerictype を指定しても、変数が固定小数点であることは自動的に指定されません。fi クラスと numerictype の両方を指定しなければなりません。

固定小数点入力の fimath の指定

assert ( isequal ( fimath ( fiparam ), F ) )

fi 入力パラメーター fiparamfimath プロパティを、fimath オブジェクト F に設定します。たとえば、固定小数点入力 U が整数オーバーフローで飽和するようにその fimath プロパティを指定するには、次のコードを使用します。

%#codegen
...
% Define the fimath object.
F = fimath('OverflowMode','saturate');

% Set the fimath property of input U to F.
assert(isequal(fimath(U),F));
... 
assert を使用して fimath プロパティを設定しない場合、codegen は MATLAB の既定の fimath 値を使用します。

入力の複数プロパティの指定

assert ( function1 ( params ) && 
         function2 ( params ) && 
         function3 ( params ) && ... )

単独の関数 assert 呼び出しを使用して 1 つ以上の入力のクラス、サイズ、実数/複素数を指定します。たとえば次のコードは、入力 U が double、複素数、3 行 3 列の行列で、入力 V が 16 ビット符号なしの整数であることを指定します。

%#codegen
...
assert(isa(U,'double') && 
       ~isreal(U) && 
       all(size(U) == [3 3]) && 
       isa(V,'uint16'));
... 

関数 assert の使用規則

関数 assert を使用して基本関数入力のプロパティを指定するときは、次の規則に従います。

  • 基本関数の開始時に、if ステートメントやサブルーチンの呼び出しなどのフロー制御操作を行う前に、関数 assert を呼び出します。

  • ifforwhileswitch ステートメントなどの条件構造内では、関数 assert を呼び出さないでください。

  • 固定小数点入力の場合は、fi クラスと numerictype の両方を指定しなければなりません。固定小数点入力の numerictype の指定を参照してください。fimath プロパティも設定できます。固定小数点入力の fimath の指定を参照してください。fimath プロパティを設定しない場合、codegen は MATLAB の既定の fimath 値を使用します。

  • 入力パラメーターのクラスを struct に設定する場合は、構造体定義に表示されるようにするために、すべてのフィールドのクラス、サイズおよび実数/複素数を指定しなければなりません。

  • assert(all(size(param)>=[M0 M1 ...])) を使用して入力パラメーターの各次元の下限サイズを指定する場合、以下の条件があります。

    • 入力パラメーターの各次元の上限サイズも指定しなければならない。

    • 各次元 k の下限 Mk は上限 Nk 以下でなければならない。

    • 固定サイズの次元を指定するには、次元の下限と上限を同じ値に設定する。

    • 制限は非負でなければならない。

  • 個々の次元を指定する場合は、以下の規則が適用されます。

    • 少なくとも 1 回は各次元のサイズを指定しなければならない。

    • 最後の次元の指定が前の指定より優先される。

基本入力の一般的なプロパティの指定

次のコード例では、基本 MATLAB 関数 mcspecgram は 2 つの入力、pennywhistlewin を取ります。コードではこれらの入力に対して次のプロパティを指定します。

入力プロパティ
pennywhistleクラスint16
サイズ220,500 行 1 列のベクトル
実数/複素数real (既定値)
winクラスdouble
サイズ1024 行 1 列のベクトル
実数/複素数real (既定値)

%#codegen
function y = mcspecgram(pennywhistle,win)
nx = 220500;
nfft = 1024;
assert(isa(pennywhistle,'int16'));
assert(all(size(pennywhistle) == [nx 1]));
assert(isa(win, 'double'));
assert(all(size(win) == [nfft 1]));
...

また、assert コマンド内の 1 つ以上の入力に対し、プロパティの指定を組み合わせることもできます。

%#codegen
function y = mcspecgram(pennywhistle,win)
nx = 220500;
nfft = 1024;
assert(isa(pennywhistle,'int16') && all(size(pennywhistle) == [nx 1]));
assert(isa(win, 'double') && all(size(win) == [nfft 1]));
...

基本固定小数点入力のプロパティの指定

固定小数点入力を指定するには、Fixed-Point Designer™ ソフトウェアをインストールしなければなりません。

以下の例では、基本 MATLAB 関数 mcsqrtfi は 1 つの固定小数点入力 x を取ります。コードではこの入力に対して次のプロパティを指定します。

プロパティ
クラスfi
numerictypenumerictype オブジェクト T (基本関数内で指定)
fimathfimath オブジェクト F (基本関数内で指定)
サイズscalar
実数/複素数real (既定値)

function y = mcsqrtfi(x) %#codegen
T = numerictype('WordLength',32,'FractionLength',23,...
                'Signed',true);
F = fimath('SumMode','SpecifyPrecision',...
           'SumWordLength',32,'SumFractionLength',23,...
           'ProductMode','SpecifyPrecision',...
           'ProductWordLength',32,'ProductFractionLength',23);
assert(isfi(x));
assert(isequal(numerictype(x),T));
assert(isequal(fimath(x),F));

y = sqrt(x);

fi クラスと numerictype の両方を指定しなければなりません。

cell 配列のプロパティの指定

クラス cell (cell 配列) を指定するには、以下のいずれかの構文を使用します。

assert(iscell(param))
assert(isa( param, 'cell'))

たとえば、入力 C のクラスを cell に設定するには、次を使用します。

...
assert(iscell(C));
...

または

...
assert(isa(C, 'cell'));
...

cell 配列のサイズと cell 配列要素のプロパティを指定することもできます。指定する要素の数で、cell 配列が同種か異種混合かが決まります。cell 配列のコード生成 (MATLAB Coder)を参照してください。

最初の要素のみプロパティを指定すると、cell 配列は同種になります。たとえば、以下のコードは、C が 1 行 1 列の double の要素をもつ 1 行 3 列の同種 cell 配列であることを指定します。

...
assert(isa(C, 'cell'));
assert(all(size(C) == [1  3]));
assert(isa(C{1}, 'double'));
...

最初の要素のプロパティのみ指定する場合でも、構造体の型の名前を cell 配列に割り当てると、cell 配列は異種混合になります。各要素には最初の要素のプロパティが含まれます。たとえば、以下のコードは、C が 1 行 3 列の異種混合 cell 配列であることを指定します。各要素は 1 行 1 列の double です。

...
assert(isa(C, 'cell'));
assert(all(size(C) == [1  3]));
assert(isa(C{1}, 'double'));
coder.cstructname(C, 'myname');
...

各要素のプロパティを指定すると、cell 配列は異種混合になります。たとえば、以下のコードは、最初の要素が 1 行 1 列の char で、2 番目の要素が 1 行 3 列の double である、1 行 2 列の異種混合 cell 配列であることを指定します。

...
assert(isa(C, 'cell'));
assert(all(size(C) == [1  2]));
assert(isa(C{1}, 'char'));
assert(all(size(C{2}) == [1 3]));
assert(isa(C{2}, 'double'));
...

1 つを超える要素を指定する場合、すべての要素のプロパティが同じであっても cell 配列が可変サイズであることを指定できません。たとえば、以下のコードは可変サイズの cell 配列を指定します。このコードでは、最初の要素と 2 番目の要素のプロパティを指定しているため、コード生成は失敗します。

...
assert(isa(C, 'cell'));
assert(all(size(C) <= [1  2]));
assert(isa(C{1}, 'double'));
assert(isa(C{2}, 'double'));
...

前の例では、最初の要素のみを指定すると、cell 配列が可変サイズであることを指定できます。以下に例を示します。

...
assert(isa(C, 'cell'));
assert(all(size(C) <= [1  2]));
assert(isa(C{1}, 'double'));
...

スカラー構造体のクラスとサイズの指定

S を次のスカラー MATLAB 構造体として定義しているとします。

S = struct('r',double(1),'i',int8(4));
以下のコードは、関数入力 S とそのフィールドのプロパティを指定します。
function y = fcn(S)  %#codegen


% Specify the class of the input as struct.
assert(isstruct(S));

% Specify the class and size of the fields r and i
% in the order in which you defined them.
assert(isa(S.r,'double'));
assert(isa(S.i,'int8');
...

ほとんどの場合、プロパティに対して明示的に値が指定されていないときは、MATLAB Coder では、構造体フィールドを除き、既定値が使用されます。構造体内のフィールドに名前を付けるには、そのプロパティの少なくとも 1 つを設定することが唯一の方法です。最低限、構造体フィールドのクラスを指定しなければなりません。

構造体配列のクラスとサイズの指定

構造体配列の場合は、各フィールドのプロパティを指定するために配列の代表的な要素を選択しなければなりません。たとえば、S を次のような 1 行 2 列の配列の MATLAB 構造体として定義してあるとします。

S = struct('r',{double(1), double(2)},'i',{int8(4), int8(5)});

以下のコードは、配列の最初の要素を使用して構造体入力 S の各フィールドのクラスとサイズを指定します。

%#codegen
function y = fcn(S)

% Specify the class of the input S as struct.
assert(isstruct(S));

% Specify the size of the fields r and i
% based on the first element of the array.
assert(all(size(S) == [1 2]));
assert(isa(S(1).r,'double'));
assert(isa(S(1).i,'int8'));
構造体内のフィールドに名前を付けるには、そのプロパティの少なくとも 1 つを設定することが唯一の方法です。最低限、すべてのフィールドのクラスを指定しなければなりません。