Main Content

MATLAB ファイル内でのプログラミングによる入力プロパティの定義

assert の使用方法

MATLAB® 関数 assert を使用して、基本関数入力のプロパティを MATLAB ファイルに直接定義できます。

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

任意クラスの指定

assert ( isa ( param, 'class_name') )

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

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

メモ

入力パラメーターのクラスを fi に設定する場合は、その numerictype も設定しなければなりません (固定小数点入力の numerictype の指定を参照)。その fimath プロパティも設定できます (固定小数点入力の fimath の指定を参照)。

入力パラメーターのクラスを struct に設定する場合は、すべてのフィールドのプロパティを、構造体でフィールドを定義したのと同じ順番で指定しなければなりません。

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 の指定を参照)。

構造体クラスの指定

assert ( isstruct ( param ) )

入力パラメーター 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 ( 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 として指定するには、次のコードを使用します。

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

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

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

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

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

...
% Define the fimath object.
F = fimath('OverflowAction','Saturate');

% Set the fimath property of input U to F.
assert(isequal(fimath(U),F));
... 

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

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

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

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

関数 assert の使用規則

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

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

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

  • 入力パラメーターのクラスを fi に設定する場合は、次の点に注意してください。

  • 入力パラメーターのクラスを struct に設定する場合は、構造体のすべてのフィールドのクラス、サイズ、実数/複素数を、構造体でフィールドを定義したのと同じ順番で指定しなければなりません。

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

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

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

function y = emcsqrtfi(x)
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);

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

MATLAB クラスの 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 配列は異種混合になります。たとえば、以下のコードは、最初の要素が 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',fi(4,true,8,0));
このコードは、MATLAB 関数に入力として渡されたときに、S のクラスとサイズ、およびフィールドを指定します。
function y = fcn(S)

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

% Specify the size of the fields r and i
% in the order in which you defined them.
T = numerictype('Wordlength', 8,'FractionLength', ...
   0,'signed',true);
assert(isa(S.r,'double'));
assert(isfi(S.i) && isequal(numerictype(S.i),T));

y = S;

メモ

構造体内のフィールドに名前を付けるには、そのプロパティの少なくとも 1 つを設定することが唯一の方法です。このため前の例では、double が既定ですが、関数 assert によってフィールド S.r のデータ型が double と指定されます。

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

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

S = struct('r',{double(1), double(2)},'i',...
   {fi(4,1,8,0), fi(5,1,8,0)});

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

function y = fcn(S)

% Specify the class of the input S as struct.
assert(isstruct(S));
T = numerictype('Wordlength', 8,'FractionLength', ...
   0,'signed',true);

% 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(isfi(S(1).i) && isequal(numerictype(S(1).i),T));

y = S;

メモ

構造体内のフィールドに名前を付けるには、そのプロパティの少なくとも 1 つを設定することが唯一の方法です。したがって上記の例では、関数 assert は、フィールド S(1).rdouble 型であることを指定します (ただし、double は既定値です)。