主要内容

このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。

配列作成関数に対するクラス サポート

ユーザークラス向けの配列作成関数の拡張

0など、特定のサイズや型の配列を作成する MATLAB®関数がいくつかあります。ユーザー定義クラスには,オーバーロードメソッドの構文を使用する必要なしに,配列作成関数のサポートを追加できます。

任意の配列作成関数にクラスがサポートされるため,組み込みデータ型およびユーザー定義のデータ型と共有できるコードを開発できるようになります。たとえば,最初の開発期間中に,次のコード変数xのクラスを組み込み型に設定し,その後0を透過的にオーバーロードするユーザー定義クラスで置き換えることもできます。

cls =类(x);zArray = 0 (m, n, cls);

配列作成関数は、次の 2.つの方法で特定の型の配列を作成します。

  • クラス名の構文 — 配列要素の型を特定するクラス名を指定します。

  • プロトタイプオブジェクトの構文——配列の要素型と他の特性を決定するために関数が使用するプロトタイプオブジェクトを指定します。

以下に例を示します。

zArray = 0(2、3、“uint8”);
P = uint8([1 3 5;2 4 6]);zArray = 0(2、3、“喜欢”,p);

これらの関数に対するサポートをMyClassという名前のクラスに追加した後,そのクラスに同様の構文が使用できるようになります。

zArray = 0(2、3、“我的班级”);

または,ユーザークラスのオブジェクトを渡します。

p=MyClass(…);zArray=0(大小(p),“喜欢”,p);

MATLABはこれらの引数を使用してユーザー クラスの適切なメソッドにディスパッチします。

オーバーロードをサポートする配列作成関数

以下の関数は、この種類のオーバーロードをサポートします。

配列作成関数
0
眼睛
(小文字)
inf
符合事实的
兰德
randn
兰迪

使用する構文

既定のオブジェクトの配列を作成する場合は,コンストラクターに入力引数を指定する必要がないため,クラス名の構文を使用します。

特定のプロパティ値をもつオブジェクトの配列を作成するか、コンストラクターが他の入力を必要とする場合は、プロトタイプ オブジェクトを使用してこの情報を提供します。

クラスは、クラス名の構文とプロトタイプ オブジェクトの構文の両方をサポートすることができます。

関数符合事实的と関数でクラス名の構文を実装することができます。ただし,既定ではこれらの関数はその構文をサポートしません。

プロトタイプメソッドが存在しない場合に呼び出されるクラス名メソッド

使用するクラスがクラス名の構文を実装しているが、特定の関数に対するプロトタイプ オブジェクトの構文を実装しない場合でも、両方の構文を呼び出すことができます。たとえば、静的0メソッドのみを実装する場合、次の構文を呼び出せます。

0(…“喜欢”,MyClass(…)

プロトタイプオブジェクトの構文を呼び出す場合,MATLABは最初に零级という名前のメソッドを検索します。MATLABがメソッドを検出できなかった場合、0静的メソッドを呼び出します。

この機能は,配列の作成にクラス名のみが必要な場合に便利です。完全な配列作成関数の構文をサポートするために,両方のメソッドを実装する必要はありません。クラス名の構文のみを実装する場合、プロトタイプ オブジェクトの構文の呼び出しは、クラス名の構文の呼び出しと同じです。

配列作成関数に対するサポートの実装

配列作成関数をサポートするには,2つの異なるメソッドを使用します。一方のメソッドはクラス名の構文を実装し,他方のメソッドはプロトタイプオブジェクトの構文を実装します。

たとえば,関数0をサポートするには,次のようにします。

  • クラス名の構文を

    0(…,“名称”)

    静态メソッドとして実装します。

    方法(静态)作用Z = 0 (varargin)…结束结束
  • プロトタイプオブジェクトの構文は,

    0(…“喜欢”obj)

    烧焦ベクトル“喜欢”が名前に付加された隐藏的メソッドとして実装します。

    方法(隐藏)作用z=zerosLike(obj,varargin)。。。结束结束

MATLABによる関数呼び出しの解釈

構文の解釈により配列作成関数に対する特別なサポートが得られます。

  • 次の形式の関数0を呼び出すと,

    0(…类名称

    次の構文でクラスの静的メソッドが呼び出されます。

    ClassName.zeros(varargin{1:end-1})
  • 次の形式の関数0を呼び出すと,

    0(…“喜欢”obj)

    次の構文でクラス メソッドが呼び出されます。

    zerosLike (obj,变长度输入宗量{1:end-2})

全関数入力のサポート

配列作成関数の入力引数には,関数が返す配列の次元や,必要に応じてその他の引数も含めることができます。一般に,メソッドがサポートしなければならない3つのケースがあります。

  • 次元の入力引数が存在せず,結果としてスカラーが返される。以下に例を示します。

    z = 0 (“我的班级”);
  • 1.つ以上の次元が 0以下であり、結果として空配列になる。以下に例を示します。

    z = 0 (2 0“我的班级”);
  • 任意の数の有効な配列次元が配列のサイズを指定している。以下に例を示します。

    z = 0(2、3、5,“我的班级”);

配列作成関数がクラスメソッドを呼び出す際,クラス名またはリテラル“喜欢”を除く,入力引数とオブジェクト変数をメソッドに渡します。メソッドは次のシグネチャを使って実装できます。

  • “クラス名“メソッドの場合:0(变长度输入宗量)

  • “就像を指定したプロトタイプオブジェクト”メソッドの場合:0 (obj,变长度输入宗量)

サンプルクラス

颜色クラスは,RGBHSVなど,特定の色空間における色を表します。クラス名メソッドの実装プロトタイプオブジェクトメソッドの実装の説明では,オーバーロードメソッドを実装するための基本としてこのクラスを使用しています。

classdef颜色性质= [0,0,0] [0,0,0“RGB”结束方法作用obj =颜色(cSpace、价值观)如果Nargin > 0 obj。色彩= cSpace; obj.ColorValues = values;结束结束结束结束

クラス名メソッドの実装

関数0は,最後の类名称烧焦ベクトルを取り除き、それを使用して颜色クラスの静的メソッドの呼び出しを作成します。静的メソッドに渡される引数は,配列次元引数です。

以下に,颜色クラスに対する0メソッドの実装を示します。この実装により,以下が実行されます。

  • 0メソッドを静态として定義します(必須)。

  • 0の呼び出しに次元の引数がない場合はスカラー颜色オブジェクトを返します。

  • 0の呼び出しが 0の次元引数をもつ場合は空配列を返します。

  • 既定の颜色オブジェクトの配列を返します。関数雷普马特を使用して,0の呼び出しによって指定された次元の配列を作成します。

classdef颜色...方法(静态)作用z = 0(变长度输入宗量)如果(输入参数个数= = 0)% 0(颜色)z =颜色;elseif任何([变长度输入宗量{}):< = 0)%用于任何维度<= 0的零z = Color.empty(变长度输入宗量{:});其他的% 0 (m, n,…,“颜色”)%使用属性默认值z = repmat(颜色、变长度输入宗量{:});结束结束结束结束

0メソッドは,このアプリケーションに適しているColorValuesプロパティの既定値を使用します。たとえば,メソッドの実装により,ColorValuesプロパティを[1,1,1]に設定できます。

次の目的を達成するために関数兰迪をオーバーロードすると仮定します。

  • ColorValueプロパティを1から指定最大値までの範囲の値(たとえば1 ~ 255)を取る1行3列の配列として定義する。

  • スカラー、空多次元の配列サイズに対応している。

  • それぞれ無作為なColorValuesにより,指定された次元の颜色オブジェクトの配列が返される。

classdef颜色...方法(静态)作用r =兰迪(变长度输入宗量)如果(输入参数个数= = 0)%对于randi('ClassName'))r =颜色(“RGB”兰迪(255年,[1,3]));elseif任何([变长度输入宗量{2}结束):< = 0)% For randi with any dimension <= 0r = Color.empty(变长度输入宗量{2:结束});其他的%对于randi(max,m,n,,'ClassName')如果Numel ([varargin{:}]) < 2错误('输入参数不足'结束dim =[变长度输入宗量{2}结束):;r = 0(变暗,“颜色”);k = 1:prod(dims) r(k) = Color(“RGB”兰迪(变长度输入宗量{1},[1,3]));结束结束结束结束结束

プロトタイプオブジェクトメソッドの実装

“喜欢”を指定したプロトタイプオブジェクトなど,オブジェクトの配列を返すメソッドの目的は,クラスの必要条件によって異なります。颜色クラスの場合、zeroLikeメソッドはプロトタイプオブジェクトの色彩プロパティ値をもつオブジェクトを作成しますが、ColorValuesはすべて 0になります。

以下に,颜色クラスを対象とする零级メソッドの実装を示します。この実装により,以下が実行されます。

  • 零级メソッドを隐藏的として定義します。

  • 関数0の呼び出しに次元の引数がない場合はスカラー颜色オブジェクトを返します。

  • 関数0の呼び出しが負または 0の次元引数をもつ場合は空配列を返します。

  • 関数0の呼び出しによって指定された次元の颜色オブジェクトの配列を返します。

classdef颜色...方法(隐藏)作用z = zerosLike (obj,变长度输入宗量)如果纳金==1%为0(‘喜欢’,obj)cSpace = obj.ColorSpace;z =颜色;z.ColorSpace = cSpace;elseif任何([变长度输入宗量{}):< = 0)%用于任何维度<= 0的零z = Color.empty(变长度输入宗量{:});其他的% 0 (m, n,…,“喜欢”,obj)如果~ isscalar (obj)错误('Prototype对象必须是标量'结束obj =颜色(obj。色彩,zeros(1,3,“喜欢”,obj.ColorValues);z=repmat(obj,varargin{:});结束结束结束结束

クラスの完全なリスト

以下に,オーバーロードされたメソッドのある颜色クラス定義を示します。

メモ

実際颜色クラスには、エラー チェック、色空間変換などが必要です。この非常に単純化されたバージョンは、オーバーロードされたメソッドの実装を表しています。

classdef颜色性质= [0,0,0] [0,0,0“RGB”结束方法作用obj =颜色(cSpace、价值观)如果Nargin > 0 obj。色彩= cSpace; obj.ColorValues = values;结束结束结束方法(静态)作用z = 0(变长度输入宗量)如果(输入参数个数= = 0)% 0('名称')z =颜色;elseif任何([变长度输入宗量{}):< = 0)%用于任何维度<= 0的零z = Color.empty(变长度输入宗量{:});其他的%对于零(m,n,…,'ClassName')%使用属性默认值z = repmat(颜色、变长度输入宗量{:});结束结束作用r =兰迪(变长度输入宗量)如果(输入参数个数= = 0)%对于randi('ClassName'))r =颜色(“RGB”兰迪(255年,[1,3]));elseif任何([变长度输入宗量{2}结束):< = 0)% For randi with any dimension <= 0r = Color.empty(变长度输入宗量{2:结束});其他的%对于randi(max,m,n,,'ClassName')如果Numel ([varargin{:}]) < 2错误('输入参数不足'结束dim =[变长度输入宗量{2}结束):;r = 0(变暗,“颜色”);k = 1:prod(dims) r(k) = Color(“RGB”兰迪(变长度输入宗量{1},[1,3]));结束结束结束结束方法(隐藏)作用z = zerosLike (obj,变长度输入宗量)如果纳金==1%为0(‘喜欢’,obj)cSpace = obj.ColorSpace;z =颜色;z.ColorSpace = cSpace;elseif任何([变长度输入宗量{}):< = 0)%用于任何维度<= 0的零z = Color.empty(变长度输入宗量{:});其他的% 0 (m, n,…,“喜欢”,obj)如果~ isscalar (obj)错误('Prototype对象必须是标量'结束obj =颜色(obj。色彩,zeros(1,3,“喜欢”,obj.ColorValues);z=repmat(obj,varargin{:});结束结束结束结束

関連するトピック