オブジェクト配列の作成と初期化
MATLAB® では、さまざまな方法でオブジェクト配列を作成できます。それらの方法ごとに、配列でのオブジェクトの作成方法が異なります。配列を作成する方法は最終的な目的に基づいて選択します。
ループを使用したオブジェクト配列の作成 — オブジェクトを異なる値で初期化する必要がある場合はループを使用します。
createArray (R2024a 以降) を使用したオブジェクト配列の作成 — 同じ初期値のオブジェクトの配列を作成するには
createArray
(R2024a 以降) を使用します。最後の要素の構成によるオブジェクト配列の作成 — 配列の要素を 1 つだけ構成する場合に使用します。MATLAB は、最後の要素のクラスで定義されている既定のオブジェクトをコピーし、そのコピーで配列の残りを埋めます。
ループを使用したオブジェクト配列の作成
クラス SimpleValue
を定義します。このクラスには、既定値をもつ 1 つのプロパティと、引数なしで呼び出すことができるコンストラクターがあります。
classdef SimpleValue properties prop1 = 0 end methods function obj = SimpleValue(v) if nargin > 0 obj.prop1 = v; end end end end
ループを使用して、SimpleValue
オブジェクトの配列を作成します。配列の要素ごとに prop1
の値を異なる値に設定します。
initValues = [3 -1 0 4 5]; for k = 1:5 objArray(k) = SimpleValue(initValues(k)); end
prop1
の値が initValues
に設定されていることを確認します。
p = [objArray.prop1]
p = 3 -1 0 4 5
オブジェクト配列のプロパティとメソッドへのアクセスの詳細については、Accessing Properties and Methods in Object Arraysを参照してください。
createArray
(R2024a 以降) を使用したオブジェクト配列の作成
createArray
を使用してクラスのオブジェクト配列を生成することもできます。createArray
では、配列のサイズに加え、クラス、プロトタイプ、埋め込み値の組み合わせを指定してオブジェクトの配列を生成できます。構文とオプションの詳細については、createArray
を参照してください。
classname
引数
配列のクラスを指定するには、classname
引数を使用します。
X = createArray(dims,"classname")
ループを使用したオブジェクト配列の作成で使用した SimpleValue
クラスの 1 行 5 列の配列を作成します。MATLAB は、コンストラクターを引数なしで 1 回呼び出し、そのインスタンスのコピーを配列に入力します。
X = createArray(1,5,"SimpleValue")
X = 1×5 SimpleValue array with properties: prop1
prop1
の値は、配列のいずれの要素についても、クラスで定義されている既定値になります。
[X.prop1]
ans = 0 0 0 0 0
Like
引数
既存のインスタンスまたは配列をプロトタイプとして使用してオブジェクト配列を作成するには、名前と値の引数 Like
を使用します。
X = createArray(dims,Like=prototype)
prop1
に 1.618
を代入した SimpleValue
のインスタンス phi
を作成します。Like
で phi
を使用して、クラスの 2 行 2 列のオブジェクト配列を作成します。返される配列 L
は phi
と同じクラスになります。
phi = SimpleValue(1.618); L = createArray(2,2,Like=phi)
L = 2×2 SimpleValue array with properties: prop1
createArray
で Like
を使用する場合、プロトタイプのコピーを使用して配列が埋められることはないため、phi
のプロパティ値は保持されません。プロトタイプのクラスで定義されている既定のコンストラクターが 1 回呼び出され、それが L
の要素にコピーされるため、それらの要素の prop1
は既定値になります。
[L.prop1]
ans = 0 0 0 0
FillValue
引数
既定以外のオブジェクトを含む配列を作成するには、コンストラクターの入力引数を使用してインスタンスを作成し、それを createArray
で埋め込み値として使用します。
X = createArray(dims,FillValue=instance)
prop1
に 7
を代入した SimpleValue
のインスタンスを作成し、そのインスタンスを名前と値の引数 FillValue
で使用して 3 行 1 列の配列を作成します。
s = SimpleValue(7); F = createArray(3,1,FillValue=s)
F = 3×1 SimpleValue array with properties: prop1
classname
を指定する場合とは異なり、createArray
はクラス コンストラクターを呼び出しません。配列の各要素に埋め込み値がコピーされます。各インスタンスの prop1
の値が 7
であることを確認します。[F.prop1]
ans = 7 7 7
ハンドル クラス
これまでのセクションでは値クラスに注目しました。ハンドル クラスの場合は、createArray
は配列の要素ごとに一意のハンドルを作成します。たとえば、クラス プロパティ用の乱数を生成するコンストラクターをもつハンドル クラスを定義します。
classdef InitHandleArray < handle properties Num end methods function obj = InitHandleArray(varargin) if nargin == 1 obj.Num = randi(varargin{1}); else obj.Num = -4; end end end end
createArray
を使用して既定の InitHandleArray
オブジェクトの 2 行 2 列の配列を返します。
Y = createArray(2,2,"InitHandleArray")
Y = 2×2 InitHandleArray array with properties: Num
ハンドルは一意ですが、MATLAB はコンストラクターを 1 回だけ呼び出し、そのインスタンスのコピーを配列に入力します。Num
プロパティの値をチェックして、引数なしのコンストラクターが呼び出されたことを確認します。
[Y.Num]
ans = -4 -4 -4 -4
最後の要素の構成によるオブジェクト配列の作成
ループを使用したオブジェクト配列の作成の SimpleValue
の例では、objArray
のオブジェクトがループの内部で作成されます。配列の最後の要素を構成して、SimpleValue
オブジェクトの配列を作成することもできます。
たとえば、配列の最後の要素を構成して SimpleValue
オブジェクトの 2 行 2 列の配列を作成します。
a(2,2) = SimpleValue
a = 2×2 SimpleValue array with properties: prop1
値クラスの配列
値クラス オブジェクトの配列の最後の要素を構成すると、MATLAB は以下を行います。
引数なしのコンストラクターを呼び出します。
残りの要素をそのインスタンスのコピーで埋めます。
入力引数が 7
の b(5)
を構成して SimpleValue
の 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 は以下を行います。
配列の各要素に一意のハンドルを作成します。
引数なしのコンストラクターを呼び出します。
残りの要素をそのインスタンスのコピーで埋めます。
入力引数が 3
の c(5)
を構成して InitHandleArray
クラス (ハンドル クラスを参照) の 1 行 5 列の配列を新たに作成し、Num
の値を確認します。MATLAB は、コンストラクターをもう一度呼び出し、その呼び出しの結果をコピーして c(1)
~ c(4)
に代入します。
c(5) = InitHandleArray(3); z = [c.Num]
z = -4 -4 -4 -4 3
コンストラクターでのオブジェクト配列の作成
クラス コンストラクター自体を使用して、オブジェクト配列を作成して返すこともできます。たとえば、ObjectArray
クラスはサイズと形状が入力配列 F
と同じオブジェクト配列を作成します。その後、コンストラクターは、各オブジェクトの Value
プロパティを対応する入力配列の値に初期化します。
classdef ObjectArray properties Value end methods function obj = ObjectArray(F) if nargin ~= 0 n = numel(F); p(n) = obj; for i = 1:n p(i) = F(i); end obj = reshape(p,size(F)); end end end end
コンストラクターのこのパターンは、引数なしのオプションが含まれている限り、値オブジェクトとハンドル オブジェクトの両方で機能します。