Main Content

入力としてのオブジェクトの指定

fiaccel を使用してコードを高速化させる場合、値クラス オブジェクトである入力のタイプを指定するために、-args オプションを使用してオブジェクト例を指定できます。

  1. 値クラスを定義します。たとえば、クラス myRectangle を定義します。

    classdef myRectangle
        properties
            length;
            width;
        end
        methods
            function obj = myRectangle(l,w)
                if nargin > 0
                    obj.length = l;
                    obj.width = w;
                end
            end
            function area = calcarea(obj)
                area = obj.length * obj.width;
            end
        end
    end

  2. 値クラスのオブジェクトを入力として取得する関数を定義します。次に例を示します。

    function z = getarea(r)
    %#codegen
    z = calcarea(r);
    end

  3. クラスのオブジェクトを定義します。

    rect_obj = myRectangle(fi(4),fi(5))
    

    rect_obj = 
    
      myRectangle with properties:
    
        length: [1×1 embedded.fi]
         width: [1×1 embedded.fi]
  4. -args オプションを使用して、オブジェクト例を fiaccel に渡します。

    fiaccel getarea -args {rect_obj} -report

    レポートでは、r がオブジェクト例 rect_object と同じプロパティ (length および width) をもっていることが分かります。

オブジェクト例を指定する代わりに、値クラスのオブジェクトのタイプを作成し、-args オプションを使用してそのタイプを指定することができます。

  1. クラスのオブジェクトを定義します。

    rect_obj = myRectangle(fi(4),fi(5))
    rect_obj = 
    
      myRectangle with properties:
    
        length: [1×1 embedded.fi]
         width: [1×1 embedded.fi]

  2. rect_obj と同じプロパティ タイプをもつ myRectangle のオブジェクトのタイプを作成するには、coder.typeof を使用します。coder.typeof はクラスのタイプを定義する coder.ClassType オブジェクトを作成します。

    t= coder.typeof(rect_obj)
    
    t = 
    
    coder.ClassType
       1×1 myRectangle   
          length: 1×1 embedded.fi
                    DataTypeMode: Fixed-point: binary point scaling
                      Signedness: Signed
                      WordLength: 16
                  FractionLength: 12
          
          width : 1×1 embedded.fi
                    DataTypeMode: Fixed-point: binary point scaling
                      Signedness: Signed
                      WordLength: 16
                  FractionLength: 12

  3. -args オプションを使用して、型を fiaccel に渡します。

    fiaccel getarea -args {t} -report

タイプを作成したら、プロパティのタイプを変更できます。

t.Properties.length = coder.typeof(fi(0,1,32,29))
t.Properties.width = coder.typeof(fi(0,1,32,29))

プロパティを追加または削除することもできます。たとえば、newprop プロパティを追加する方法は以下のとおりです。

t.Properties.newprop = coder.typeof(int16(1))

coder.ClassType オブジェクトとクラス定義ファイル間の整合性

コードを高速化するとき、fiaccel に渡される coder.ClassType オブジェクトのプロパティはクラス定義ファイル内のプロパティと一致していなければなりません。コードで使用されていないプロパティがクラス定義ファイルに存在する場合、coder.ClassType オブジェクトはこれらのプロパティを含める必要はありません。fiaccel は使用していないプロパティを削除します。

オブジェクトをエントリポイント関数の入力として使用する場合の制限事項

オブジェクトであるエントリポイント関数の入力には次のような制限事項があります。

  • エントリポイント関数の入力であるオブジェクトは、値クラスのオブジェクトでなければなりません。ハンドル クラスのオブジェクトをエントリポイント関数の入力にすることはできません。そのため、ハンドル クラスを含む値クラスをエントリポイント関数の入力にすることはできません。

  • オブジェクトをグローバル変数にすることはできません。

  • オブジェクトに重複するプロパティ名がある場合は、そのオブジェクトを coder.Constant で使用できません。次の場合、サブクラスのオブジェクトでプロパティ名が重複します。

    • サブクラスに、スーパークラスのプロパティと同じ名前のプロパティがある。

    • サブクラスが、プロパティに同じ名前を使用する複数のスーパークラスから派生している。

    MATLAB® で重複するプロパティ名が許可される場合の詳細については、複数のクラスからのサブクラスの作成を参照してください。

参考

関連するトピック