コード生成のための MATLAB クラスの定義
MATLAB® クラスの効率の良いスタンドアロン コードを生成するには、MATLAB 環境でコードを実行する場合とは異なる方法でクラスを使用しなければなりません。
言語制約
プロパティやメソッドなどの一般的なクラスの機能に対してはコード生成がサポートされていますが、以下のようなサポートされていない高度な機能が数多くあります。
イベント
リスナー
オブジェクトの配列
再帰データ構造体
リンク付きリスト
Trees
グラフ
コンストラクターにおける入れ子関数
オーバーロードが可能な演算子
subsref
、subsassign
、subsindex
MATLAB では、クラスで独自のバージョンの
subsref
、subsassign
、subsindex
メソッドを定義できます。コード生成では、これらのメソッドの独自の定義をもつクラスはサポートされていません。empty
メソッドMATLAB のクラスには、クラスの空配列を作成する組み込み静的メソッド
empty
が含まれています。コード生成は、このメソッドをサポートしていません。以下の MATLAB ハンドル クラス メソッド:
addlistener
eq
findobj
findprop
AbortSet
プロパティ属性
クラスと整合性がないコード生成機能
クラスを使用するエントリポイント MATLAB 関数のコードは生成できますが、MATLAB クラスのコードを直接生成することはできません。
たとえば、
ClassNameA
がクラス定義である場合、以下を実行してコードを生成することはできません。codegen ClassNameA
ハンドル クラス オブジェクトは、エントリポイント関数の入力または出力にできません。
値クラス オブジェクトはエントリポイント関数の入力または出力にすることができます。ただし、値クラス オブジェクトにハンドル クラス オブジェクトが含まれる場合、値クラス オブジェクトはエントリポイント関数の入力または出力にできません。ハンドル クラス オブジェクトは、エントリポイント関数の入力または出力にできません。
コード生成は、ハンドル クラスのグローバル変数をサポートしません。
コード生成は、コンストラクターからの複数の出力をサポートしていません。
クラスは Simulink® 信号、パラメーター、データ ストア メモリでは使用できません。
コード生成は、値クラスのオブジェクトを調整不可能なプロパティに割り当てることをサポートしていません。たとえば、
prop
が調整不可能なプロパティであり、かつv
が値クラスに基づいたオブジェクトである場合、obj.prop=v;
は無効です。coder.extrinsic
を使用してクラスまたはメソッドを外部のものとして宣言することはできません。MATLAB クラスを関数
coder.ceval
に渡すことはできません。クラスのプロパティをcoder.ceval
に渡すことはできます。プロパティに get メソッド、set メソッド、または検証関数がある場合、またはプロパティが特定の属性をもつ System object™ プロパティである場合、そのプロパティを外部関数に参照で渡すことはできません。一部のプロパティでサポートされない参照渡しを参照してください。
MATLAB Function ブロック内のコードでクラスを使用している場合、デバッガーを使ってクラス情報を見ることができません。
オブジェクトに重複するプロパティ名がある場合に、コード ジェネレーターがオブジェクトの定数畳み込みを実行しようとすると、コード生成が失敗する可能性があります。コード ジェネレーターがオブジェクトに対して定数畳み込みを行うのは、そのオブジェクトが
coder.const
で使用されているか、オブジェクトが定数畳み込みが行われた外部関数への入力または出力である場合です。次の場合、サブクラスのオブジェクトでプロパティ名が重複します。
サブクラスに、スーパークラスのプロパティと同じ名前のプロパティがある。
サブクラスが、プロパティに同じ名前を使用する複数のスーパークラスから派生している。
重複するプロパティ名は、多重継承に関連するクラスにわたって一貫して定数または非定数である必要があります。たとえば、定数プロパティ
aProp
をもつオブジェクトが、aProp
が非定数として定義されているスーパークラスからaProp
を継承する場合、コード生成でエラーが発生します。MATLAB で重複するプロパティ名が許可される場合の詳細については、複数のクラスからのサブクラスの作成を参照してください。
コード生成のためのクラス プロパティの定義
コードを生成するには、MATLAB 環境でコードを実行する場合とは異なる形式でクラスのプロパティを定義しなければなりません。
プロパティ検証でエラーが発生すると、エラー メッセージを表示してシミュレーションが終了します。プロパティ検証をテストするには、入力値の全範囲に対してシミュレーションを実行することをお勧めします。Simulink Coder™ によって生成された C/C++ コードでは、プロパティ検証エラーの検出または報告は行われません。
プロパティを定義した後は、それを互換性のない型に割り当てないでください。プロパティは、拡大を試みてから使用してください。
コード生成用にクラス プロパティを定義する際は、変数を定義するときと同様のことを考慮に入れてください。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)
を返します。
可変サイズのプロパティ:
コード生成では、値クラスとハンドル クラスの両方に対して、上限付きと制限なしの可変サイズのプロパティをサポートします。
制限なしの可変サイズのクラス プロパティを生成するには、動的メモリ割り当てを有効にします。
可変サイズのクラス プロパティを作成するには、クラス プロパティの 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-sized. 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-sized 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 クラスから継承したクラスのコードを生成できます。列挙型のコードの生成 (MATLAB Coder)を参照してください。
参考
関連するトピック
- 実行時エラーを検出および報告するスタンドアロン C/C++ コードの生成 (MATLAB Coder)
- コード生成に対応するクラス