Main Content

オブジェクト配列の作成と初期化

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)

prop11.618 を代入した SimpleValue のインスタンス phi を作成します。Likephi を使用して、クラスの 2 行 2 列のオブジェクト配列を作成します。返される配列 Lphi と同じクラスになります。

phi = SimpleValue(1.618);
L = createArray(2,2,Like=phi)
L = 

  2×2 SimpleValue array with properties:

    prop1

createArrayLike を使用する場合、プロトタイプのコピーを使用して配列が埋められることはないため、phi のプロパティ値は保持されません。プロトタイプのクラスで定義されている既定のコンストラクターが 1 回呼び出され、それが L の要素にコピーされるため、それらの要素の prop1 は既定値になります。

[L.prop1]
ans =

     0     0     0     0

FillValue 引数

既定以外のオブジェクトを含む配列を作成するには、コンストラクターの入力引数を使用してインスタンスを作成し、それを createArray で埋め込み値として使用します。

X = createArray(dims,FillValue=instance)

prop17 を代入した 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 は以下を行います。

  • 引数なしのコンストラクターを呼び出します。

  • 残りの要素をそのインスタンスのコピーで埋めます。

入力引数が 7b(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 は以下を行います。

  • 配列の各要素に一意のハンドルを作成します。

  • 引数なしのコンストラクターを呼び出します。

  • 残りの要素をそのインスタンスのコピーで埋めます。

入力引数が 3c(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

コンストラクターのこのパターンは、引数なしのオプションが含まれている限り、値オブジェクトとハンドル オブジェクトの両方で機能します。

関連するトピック