入力としてのオブジェクトの指定
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® で重複するプロパティ名が許可される場合の詳細については、複数のクラスからのサブクラスの作成を参照してください。