入力としてのオブジェクトの指定
fiaccel
を使用してコードを高速化させる場合、値クラス オブジェクトである入力のタイプを指定するために、-args
オプションを使用してオブジェクト例を指定できます。
値クラスを定義します。たとえば、クラス
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
値クラスのオブジェクトを入力として取得する関数を定義します。次に例を示します。
function z = getarea(r) %#codegen z = calcarea(r); end
クラスのオブジェクトを定義します。
rect_obj = myRectangle(fi(4),fi(5))
rect_obj = myRectangle with properties: length: [1×1 embedded.fi] width: [1×1 embedded.fi]
-args
オプションを使用して、オブジェクト例をfiaccel
に渡します。fiaccel getarea -args {rect_obj} -report
レポートでは、
r
がオブジェクト例rect_object
と同じプロパティ (length
およびwidth
) をもっていることが分かります。
オブジェクト例を指定する代わりに、値クラスのオブジェクトのタイプを作成し、-args
オプションを使用してそのタイプを指定することができます。
クラスのオブジェクトを定義します。
rect_obj = myRectangle(fi(4),fi(5))
rect_obj = myRectangle with properties: length: [1×1 embedded.fi] width: [1×1 embedded.fi]
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
-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® で重複するプロパティ名が許可される場合の詳細については、複数のクラスからのサブクラスの作成を参照してください。