オブジェクト配列の作成と初期化
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:
prop1prop1 の値は、配列のいずれの要素についても、クラスで定義されている既定値になります。
[X.prop1]
ans =
0 0 0 0 0Like 引数
既存のインスタンスまたは配列をプロトタイプとして使用してオブジェクト配列を作成するには、名前と値の引数 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 0FillValue 引数
既定以外のオブジェクトを含む配列を作成するには、コンストラクターの入力引数を使用してインスタンスを作成し、それを 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:
prop1classname を指定する場合とは異なり、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 7SimpleValue コンストラクターが引数なしの呼び出しを処理できない場合、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
コンストラクターのこのパターンは、引数なしのオプションが含まれている限り、値オブジェクトとハンドル オブジェクトの両方で機能します。