Main Content

コード生成のための MATLAB クラスの定義

MATLAB® クラスの効率の良いスタンドアロン コードを生成するには、MATLAB 環境でコードを実行する場合とは異なる方法でクラスを使用しなければなりません。

言語制約

プロパティやメソッドなどの一般的なクラスの機能に対してはコード生成がサポートされていますが、以下のようなサポートされていない高度な機能が数多くあります。

  • イベント

  • リスナー

  • オブジェクトの配列

  • 再帰データ構造体

    • リンク付きリスト

    • Trees

    • グラフ

  • コンストラクターにおける入れ子関数

  • オーバーロードが可能な演算子 subsrefsubsassignsubsindex

    MATLAB では、クラスで独自のバージョンの subsrefsubsassignsubsindex メソッドを定義できます。コード生成では、これらのメソッドの独自の定義をもつクラスはサポートされていません。

  • 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 に格納されます。locVarcoder.varsize によって可変サイズに変更され、クラス プロパティ obj.prop に代入されるため、そのプロパティは可変サイズになります。

      • 関数呼び出し varSizeProp2 への入力が可変サイズの場合、coder.varsize は必要ありません。

        function z = constructCall(n)
            z = varSizeProp2(1:n);
        end
      • n の値がコンパイル時に不明で、その範囲が指定されていない場合、z.prop は制限なしの可変サイズのクラス プロパティです。

      • n の値がコンパイル時に不明で、その範囲が指定されている場合、z.prop は上限付きの可変サイズのクラス プロパティです。

  • プロパティは定数で、その値がオブジェクトの場合、そのオブジェクトのプロパティの値を変更できません。たとえば、次の場合を仮定します。

    • objmyClass1 のオブジェクトです。

    • myClass1 には、myClass2 のオブジェクトである定数プロパティ p1 があります。

    • myClass2 にはプロパティ p2 があります。

    コード生成は、以下のコードをサポートしていません。

    obj.p1.p2 = 1;

サポートされない組み込みの MATLAB クラスからの継承

組み込みの MATLAB クラスから継承したクラスのコードは生成できません。たとえば、次のクラスのコードは生成できません。

classdef myclass < double

このルールの例外は MATLAB 列挙型クラスです。列挙型クラスについては、組み込みの MATLAB クラスから継承したクラスのコードを生成できます。列挙型のコードの生成 (MATLAB Coder)を参照してください。

参考

関連するトピック