Main Content

クラスでの size と numel の使用

size と numel

関数 size は、配列の次元を返します。関数 numel は、配列内の要素の数を返し、これは prod(size(objArray)) と同値です。つまり、配列の次元の積です。

関数 sizenumel は、ユーザー定義オブジェクトの配列を一貫して処理します。通常、ユーザー定義クラスでは size または numel をオーバーロードする必要はありません。

MATLAB® 関数の中には、その操作の実行に sizenumel を使用するものがあります。したがって、ユーザー クラス内でこれらの関数をオーバーロードさせる場合は、ユーザー クラスのオブジェクトがその設計どおりに、他の MATLAB 関数を処理することを確認してください。

ユーザー クラスが配列インデックス付けを変更する場合は、numel の代わりに numArgumentsFromSubscript をオーバーロードを参照してください。

組み込みクラスの動作

組み込みクラスから派生したクラス内で関数 size および numel を使用する場合、これらの関数は、スーパークラス内で動作するときと同じように動作します。

以下のような組み込みクラス double があるとします。

d = 1:10;
size(d)
ans =

     1    10
numel(d)
ans =

    10
dsub = d(7:end);
size(dsub)
ans =

     1     4

double クラスは、小かっこインデックス生成を含むこれらの動作を定義します。

サブクラスでの動作の継承

サブクラスでスーパークラスの動作を明示的にオーバーライドしない限り、サブクラスはそのスーパークラスと同じように動作します。たとえば、SimpleDoubledouble をサブクラス化し、プロパティは定義しません。

classdef SimpleDouble < double
   methods
      function obj = SimpleDouble(data)
         if nargin == 0
            data = 0;
         end
         obj = obj@double(data);
      end
   end
end

オブジェクトを作成し、値 1:10 を代入します。

sd = SimpleDouble(1:10);

関数 size は、スーパークラスの部分のサイズを返します。

size(sd)
ans =

     1    10

関数 numel は、スーパークラスの部分の要素数を返します。

numel(sd)
ans =

     10

オブジェクト配列はスーパークラス配列のサイズを返します。

size([sd;sd])
ans =

     2    10
numel([sd;sd])
ans =

     20

SimpleDouble クラスは、double クラスのインデックス付け動作を継承します。

sdsub = sd(7:end);
size(sdsub)
ans =

     1     4

派生元が組み込みクラスでないクラス

簡単な値クラスの例を考えてみます。このクラスは double クラスの配列的な動作を継承しません。以下に例を示します。

classdef VerySimpleClass
   properties
      Value
   end
end

オブジェクトを作成し、Value プロパティに 10 要素の配列を割り当てます。

vs = VerySimpleClass;
vs.Value = 1:10;
size(vs)
ans =

     1     1
numel(vs)
ans =

     1
size([vs;vs])
ans =

     2     1
numel([vs;vs])
ans =

     2

vs はスカラー オブジェクトです。Value プロパティは、doubles の配列です。

size(vs.Value)
ans =

     1    10

オブジェクト プロパティにインデックス式を以下のように適用します。

vssub = vs.Value(7:end);
size(vssub)
ans =

     1     4

vs.Value プロパティは、クラス double の配列です。

class(vs.Value)
ans =

double

VerySimpleClass オブジェクトの配列を作成します。

vsArray(1:10) = VerySimpleClass;

配列要素 2 から 10 までの Value プロパティは空です。

isempty([vsArray(2:10).Value])
ans =

     1

MATLAB では、オブジェクト配列プロパティ値の割り当てにスカラー式は適用できません。この処理には、関数 deal を以下のように使用してください。

[vsArray.Value] = deal(1:10);
isempty([vsArray.Value])
ans =

     0

関数 deal は vsArray オブジェクト配列の各 Value プロパティに値を代入します。

オブジェクト配列のインデックス規則は、struct の配列の規則と同じです。

vsArray(1).Value
ans =

     1     2     3     4     5     6     7     8     9    10
vsArray(1).Value(6)
ans =

     6

size または numel の動作の変更

組み込み数値クラスのサブクラスは、size メソッドを継承します。このメソッド (非表示) は、サブクラス オブジェクトのスーパークラスの部分を処理します。size または numel に他の動作をさせる場合、ユーザーのサブクラス内で size または numel メソッドを定義してオーバーライドします。

他の MATLAB 関数はこれらの関数によって返された値を使用します。sizenumel の動作を変更する場合、返される値が、ユーザー クラスが目的とした使用において意味をもつことを確認します。

numel の代わりに numArgumentsFromSubscript をオーバーロード

クラスで numArgumentsFromSubscript メソッドを実装する場合、MATLAB は numel の代わりにそれを呼び出して、コンマ区切りリストを返すインデックス式から返される要素数を決定します。たとえば、次のような式です。

A(1:2).Prop

subsrefsubsasgn は、以下のように numArgumentsFromSubscript を使用します。

  • subsrefnumArgumentsFromSubscript は、subsref が返す予想される出力数 (nargout) を計算します。

  • subsasgnnumArgumentsFromSubscript は、subsasgn の呼び出しの結果として MATLAB から割り当てられる入力 (関数 nargin) の予想数を計算します。

組み込みクラスのサブクラスは、添字による参照の結果としてスカラー オブジェクトを返し、添字による割り当てに対してスカラー オブジェクトを使用します。

subsrefnargout または subsasgnnargin が特定の値でなければならないクラスを定義する場合、numArgumentsFromSubscript をオーバーロードしてそれらの値を返します。

参考