Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

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

doublestring などの組み込み型と同様に、インデックス付けの動作をもつクラスベースのオブジェクトの配列を作成できます。ただし、オブジェクト配列を作成するには、オブジェクトの構成方法に特別な注意を払う必要があります。

ループを使用したオブジェクト配列の作成

クラス SimpleValue を定義します。このクラスには、初期値をもつ 1 つのプロパティと、引数のない既定のコンストラクターがあります。

classdef SimpleValue
   properties
      prop1 = 0
   end
end

ループを使用して、SimpleValue オブジェクトの配列を作成します。

for k = 1:5
   objArray(k) = SimpleValue;
end

配列インデックス付けを使用して特定のオブジェクトのプロパティ値を参照して代入します。たとえば、値 5objArray(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

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

関連するトピック