コード生成のための MATLAB クラスの定義
MATLAB® クラスの効率の良いスタンドアロン コードを生成するには、MATLAB 環境でコードを実行する場合とは異なる方法でクラスを使用しなければなりません。
言語制約
プロパティやメソッドなどの一般的なクラスの機能に対してはコード生成がサポートされていますが、以下のようなサポートされていない高度な機能が数多くあります。
イベント
リスナー
オブジェクトの配列
再帰データ構造体
リンク付きリスト
Trees
グラフ
コンストラクターにおける入れ子関数
オーバーロードが可能な演算子
subsref、subsassign、subsindexMATLAB では、クラスで独自のバージョンの
subsref、subsassign、subsindexメソッドを定義できます。コード生成では、これらのメソッドの独自の定義をもつクラスはサポートされていません。emptyメソッドMATLAB のクラスには、クラスの空配列を作成する組み込み静的メソッド
emptyが含まれています。コード生成は、このメソッドをサポートしていません。以下の MATLAB ハンドル クラス メソッド:
addlistenereqfindobjfindprop
AbortSetプロパティ属性
クラスと整合性がないコード生成機能
クラスを使用するエントリポイント MATLAB 関数のコードは生成できますが、MATLAB クラスのコードを直接生成することはできません。
たとえば、
ClassNameAがクラス定義である場合、以下を実行してコードを生成することはできません。codegen ClassNameAハンドル クラス オブジェクトは、エントリポイント関数の入力または出力にできません。
値クラス オブジェクトはエントリポイント関数の入力または出力にすることができます。ただし、値クラス オブジェクトにハンドル クラス オブジェクトが含まれる場合、値クラス オブジェクトはエントリポイント関数の入力または出力にできません。ハンドル クラス オブジェクトは、エントリポイント関数の入力または出力にできません。
コード生成は、ハンドル クラスのグローバル変数をサポートしません。
コード生成は、コンストラクターからの複数の出力をサポートしていません。
コード生成は、値クラスのオブジェクトを調整不可能なプロパティに割り当てることをサポートしていません。たとえば、
propが調整不可能なプロパティであり、かつvが値クラスに基づいたオブジェクトである場合、obj.prop=v;は無効です。coder.extrinsicを使用してクラスまたはメソッドを外部のものとして宣言することはできません。MATLAB クラスを関数
coder.cevalに渡すことはできません。クラスのプロパティをcoder.cevalに渡すことはできます。プロパティに get メソッド、set メソッド、または検証関数がある場合、またはプロパティが特定の属性をもつ System object™ プロパティである場合、そのプロパティを外部関数に参照で渡すことはできません。一部のプロパティでサポートされない参照渡しを参照してください。
オブジェクトに重複するプロパティ名がある場合に、コード ジェネレーターがオブジェクトの定数畳み込みを実行しようとすると、コード生成が失敗する可能性があります。コード ジェネレーターがオブジェクトに対して定数畳み込みを行うのは、そのオブジェクトが
coder.Constantまたはcoder.constで使用されているか、オブジェクトが定数畳み込みが行われた外部関数への入力または出力である場合です。次の場合、サブクラスのオブジェクトでプロパティ名が重複します。
サブクラスに、スーパークラスのプロパティと同じ名前のプロパティがある。
サブクラスが、プロパティに同じ名前を使用する複数のスーパークラスから派生している。
重複するプロパティ名は、多重継承に関連するクラスにわたって一貫して定数または非定数である必要があります。たとえば、定数プロパティ
aPropをもつオブジェクトが、aPropが非定数として定義されているスーパークラスからaPropを継承する場合、コード生成でエラーが発生します。MATLAB で重複するプロパティ名が許可される場合の詳細については、複数のクラスからのサブクラスの作成を参照してください。
コード生成のためのクラス プロパティの定義
コードを生成するには、MATLAB 環境でコードを実行する場合とは異なる形式でクラスのプロパティを定義しなければなりません。
MEX 関数は、プロパティ検証の結果のエラーを報告します。スタンドアロン C/C++ コードは、実行時エラーのレポートを有効にしている場合のみこれらのエラーを報告します。実行時エラーを検出および報告するスタンドアロン C/C++ コードの生成を参照してください。スタンドアロン C/C++ コードを生成する前に、入力値のすべての範囲に対して MEX 関数を実行してプロパティの検証をテストすることをお勧めします。
プロパティを定義した後は、それを互換性のない型に割り当てないでください。プロパティは、拡大を試みてから使用してください。
コード生成用にクラス プロパティを定義する際は、変数を定義するときと同様のことを考慮に入れてください。MATLAB 言語では、変数は自身のクラス、サイズまたは実数/複素数を実行時に動的に変更できるため、同じ変数を使用してさまざまなクラス、サイズまたは実数/複素数の値を保持することができます。C および C++ は静的型付けを使用します。コード ジェネレーターが変数を使用する前に変数の型を判定するためには、各変数への完全な割り当てが行われている必要があります。同様に、プロパティを使用する前に、プロパティのクラス、サイズ、実数/複素数を明示的に定義しなければなりません。
初期値:
プロパティに明示的な初期値が存在しない場合、コード ジェネレーターは、コンストラクターの先頭で初期値が未定義であると認識します。コード ジェネレーターは、既定設定で空の行列を代入しません。
プロパティに初期値が存在せず、コード ジェネレーターによってそのプロパティをはじめて使用する前に代入されているかが判定できなかった場合、コンパイル エラーが発生します。
System object については、調整不可能なプロパティが構造体の場合、構造体に対して完全な代入を行なわなければなりません。添字を使った部分的な代入はできません。
たとえば、調整不可能なプロパティには以下のような代入ができます。
mySystemObject.nonTunableProperty=struct('fieldA','a','fieldB','b');
以下のような部分的な代入はできません。
mySystemObject.nonTunableProperty.fieldA = 'a'; mySystemObject.nonTunableProperty.fieldB = 'b';
coder.varsizeはクラス プロパティではサポートされていません。プロパティの初期値がオブジェクトの場合、プロパティは定数でなければなりません。プロパティを定数にするには、プロパティ ブロックで
Constant属性を宣言します。以下に例を示します。classdef MyClass properties (Constant) p1 = MyClass2; end end
コード生成は、System object を含むオブジェクトに代入される定数プロパティをサポートしません。
MATLAB では、クラスの読み込み時にクラスの初期値を計算してからコード生成を行います。MATLAB クラス プロパティの初期化で永続変数を使用すると、クラスの読み込み時に計算される永続変数の値は MATLAB に属します。この値はコード生成時に使用される値ではありません。
coder.targetを MATLAB クラス プロパティの初期化で使用した場合、coder.target('MATLAB')はtrue (1)を返します。
可変サイズのプロパティ (HLS コード生成でサポートされていません):
コード生成では、値クラスとハンドル クラスの両方に対して、上限付きと制限なしの可変サイズのプロパティをサポートします。
制限なしの可変サイズのクラス プロパティを生成するには、動的メモリ割り当てを有効にします。
可変サイズのクラス プロパティを作成するには、クラス プロパティの 2 つの順序代入 (スカラーへの代入の次に配列への代入) を作成します。
classdef varSizeProp1 < handle properties prop varProp end end
function extFunc(n) obj = varSizeProp1; % Assign a scalar value to the property. obj.prop = 1; obj.varProp = 1; % Assign an array to the same property to make it variable-size. obj.prop = 1:98; obj.varProp = 1:n; end
上記のコードでは、
propおよびvarPropへの最初の代入がスカラーで、2 番目の代入が同じ基本データ型の配列への代入です。propのサイズの上限は98であるため、上限付きの可変サイズのプロパティになります。nがコンパイル時に不明な場合、obj.varPropは制限なしの可変サイズのプロパティです。既知の場合は、上限付きの可変サイズのクラス プロパティです。クラス プロパティが可変サイズの配列で初期化される場合、そのプロパティは可変サイズです。
classdef varSizeProp2 properties prop end methods function obj = varSizeProp2(inVar) % Assign incoming value to local variable locVar = inVar; % Declare the local variable to be a variable-size column % vector with no size limit coder.varsize('locVar',[inf 1],[1 0]); % Assign value obj.prop = locVar; end end end
上記のコードでは、
inVarはクラス コンストラクターに渡されてlocVarに格納されます。locVarはcoder.varsizeによって可変サイズに変更され、クラス プロパティobj.propに代入されるため、そのプロパティは可変サイズになります。関数呼び出し
varSizeProp2への入力が可変サイズの場合、coder.varsizeは必要ありません。function z = constructCall(n) z = varSizeProp2(1:n); end
nの値がコンパイル時に不明で、その範囲が指定されていない場合、z.propは制限なしの可変サイズのクラス プロパティです。nの値がコンパイル時に不明で、その範囲が指定されている場合、z.propは上限付きの可変サイズのクラス プロパティです。
プロパティは定数で、その値がオブジェクトの場合、そのオブジェクトのプロパティの値を変更できません。たとえば、次の場合を仮定します。
objはmyClass1のオブジェクトです。myClass1には、myClass2のオブジェクトである定数プロパティp1があります。myClass2にはプロパティp2があります。
コード生成は、以下のコードをサポートしていません。
obj.p1.p2 = 1;
サポートされない組み込みの MATLAB クラスからの継承
組み込みの MATLAB クラスから継承したクラスのコードは生成できません。たとえば、次のクラスのコードは生成できません。
classdef myclass < doubleこのルールの例外は MATLAB 列挙型クラスです。列挙型クラスについては、組み込みの MATLAB クラスから継承したクラスのコードを生成できます。列挙型のコードの生成を参照してください。