このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
オブジェクト配列の作成と初期化
double
や string
などの組み込み型と同様に、インデックス付けの動作をもつクラスベースのオブジェクトの配列を作成できます。ただし、オブジェクト配列を作成するには、オブジェクトの構成方法に特別な注意を払う必要があります。
ループを使用したオブジェクト配列の作成
クラス SimpleValue
を定義します。このクラスには、初期値をもつ 1 つのプロパティと、引数のない既定のコンストラクターがあります。
classdef SimpleValue properties prop1 = 0 end end
ループを使用して、SimpleValue
オブジェクトの配列を作成します。
for k = 1:5 objArray(k) = SimpleValue; end
配列インデックス付けを使用して特定のオブジェクトのプロパティ値を参照して代入します。たとえば、値 5
を objArray(1)
の prop1
プロパティに代入します。
objArray(1).prop1 = 5;
すべてのオブジェクトに対して prop1
の値を返し、それらをベクトルに代入します。
p = [objArray.prop1]
p = 5 0 0 0 0
オブジェクト配列のプロパティとメソッドへのアクセスの詳細については、Accessing Properties and Methods in Object Arraysを参照してください。
最後の要素の構成によるオブジェクト配列の作成
SimpleValue
の例では、objArray
内のオブジェクトは、引数なしの既定のコンストラクターと初期プロパティ値を使用してループ内で作成されます。配列の最後の要素を構成して、SimpleValue
オブジェクトの配列を作成することもできます。
たとえば、SimpleValue
オブジェクトの 2 行 2 列の配列を作成します。
a(2,2) = SimpleValue
a = 2×2 SimpleValue array with properties: prop1
この方法でオブジェクト配列を作成すると、クラスが値かハンドルかに応じて、MATLAB® は 2 つの方法のいずれかを使用して、配列の残りの要素を埋めます。
値クラスの配列
値クラス オブジェクトの配列の最後の要素を構成すると、MATLAB は以下を行います。
引数なしのコンストラクターを 1 回呼び出します。
残りの要素をそのインスタンスのコピーで埋めます。
コンストラクターへの入力を使用してプロパティ値を初期化する場合は、コンストラクターに引数なしのオプションも用意する必要があります。
たとえば、入力を受け入れ、その入力を prop1
に代入するコンストラクターを SimpleValue
に追加します。
classdef SimpleValue properties prop1 = 0 end methods function obj = SimpleValue(v) if nargin > 0 obj.prop1 = v; end end end end
入力引数 7
を指定して b(5)
を構成して、1 行 5 列の配列を作成します。
b(5) = SimpleValue(7);
すべての prop1
値を返し、それらをベクトル y
に代入します。b(5)
のオブジェクトの prop1
値は 7
です。MATLAB は、引数なしのコンストラクターを 1 回呼び出し、その値を配列内の残りのすべての要素にコピーします。該当する要素の prop1
の初期値は 0
です。
y = [b.prop1]
y = 0 0 0 0 7
SimpleValue
コンストラクターが引数なしの呼び出しを処理できない場合、b(4)
を通じて b(1)
を設定しようとすると、MATLAB でエラーが発生します。
ハンドル クラスの配列
ハンドル クラス オブジェクトの配列の最後の要素を構成すると、MATLAB は以下を行います。
配列の各要素に一意のハンドルを作成します。
配列内の最後のオブジェクトからのプロパティ値をコピーします。
コンストラクターを呼び出さずに、コピーした値を使用して配列の残りのオブジェクトを作成します。
値クラスの場合とは異なり、MATLAB はコンストラクターを呼び出して配列に値を設定しないため、該当する配列内のすべてのオブジェクトが同じプロパティ値で始まります。たとえば、プロパティ用の乱数を生成するハンドル クラスを定義します。
classdef InitHandleArray < handle properties RandNum end methods function obj = InitHandleArray obj.RandNum = randi(100); end end end
c(5)
を構成して新しい 1 行 5 列の配列を作成し、prop1
値を確認します。配列を作成するために、MATLAB はコンストラクターを 2 回呼び出します。1 回目は、MATLAB は値を c(5).RandNum
に代入します。2 回目は、2 回目の呼び出しの結果を randi
に代入して c(1)
を作成します。最後に、この RandNum
の値を c
の残りの要素にコピーします。
c(5) = InitHandleArray; z = [c.RandNum]
z = 91 91 91 91 82
ハンドル クラスの配列を作成する場合、MATLAB ではコンストラクターに引数なしのオプションは必要ありませんが、すべてのクラス コンストラクターで引数なしのオプションを用意することをお勧めします。
コンストラクターでのオブジェクト配列の作成
クラス コンストラクター自体を使用して、オブジェクト配列を作成して返すこともできます。たとえば、ObjectArray
クラスは 2 次元の入力配列 F
と同じサイズのオブジェクト配列を作成します。その後、コンストラクターは、各オブジェクトの Value
プロパティを対応する入力配列の値に初期化します。
classdef ObjectArray properties Value end methods function obj = ObjectArray(F) if nargin ~= 0 m = size(F,1); n = size(F,2); p(m,n) = obj; for i = 1:m for j = 1:n p(i,j).Value = F(i,j); end end obj = p; end end end end
コンストラクターのこのパターンは、引数なしのオプションが含まれている限り、値オブジェクトとハンドル オブジェクトの両方で機能します。