クラスでの size と numel の使用
size と numel
関数 size は、配列の次元を返します。関数 numel は、配列内の要素の数を返し、これは prod(size(objArray)) と同値です。つまり、配列の次元の積です。
関数 size と numel は、ユーザー定義オブジェクトの配列を一貫して処理します。通常、ユーザー定義クラスでは size または numel をオーバーロードする必要はありません。
MATLAB® 関数の中には、その操作の実行に size や numel を使用するものがあります。したがって、ユーザー クラス内でこれらの関数をオーバーロードさせる場合は、ユーザー クラスのオブジェクトがその設計どおりに、他の MATLAB 関数を処理することを確認してください。
ユーザー クラスが配列インデックス付けを変更する場合は、numel の代わりに numArgumentsFromSubscript をオーバーロードを参照してください。
組み込みクラスの動作
組み込みクラスから派生したクラス内で関数 size および numel を使用する場合、これらの関数は、スーパークラス内で動作するときと同じように動作します。
以下のような組み込みクラス double があるとします。
d = 1:10; size(d)
ans =
1 10
numel(d)
ans =
10dsub = d(7:end); size(dsub)
ans =
1 4double クラスは、小かっこインデックス生成を含むこれらの動作を定義します。
サブクラスでの動作の継承
サブクラスでスーパークラスの動作を明示的にオーバーライドしない限り、サブクラスはそのスーパークラスと同じように動作します。たとえば、SimpleDouble は double をサブクラス化し、プロパティは定義しません。
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 10numel([sd;sd])
ans =
20SimpleDouble クラスは、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 1numel(vs)
ans =
1size([vs;vs])
ans =
2 1numel([vs;vs])
ans =
2vs はスカラー オブジェクトです。Value プロパティは、doubles の配列です。
size(vs.Value)
ans =
1 10オブジェクト プロパティにインデックス式を以下のように適用します。
vssub = vs.Value(7:end); size(vssub)
ans =
1 4vs.Value プロパティは、クラス double の配列です。
class(vs.Value)
ans = double
VerySimpleClass オブジェクトの配列を作成します。
vsArray(1:10) = VerySimpleClass;
配列要素 2 から 10 までの Value プロパティは空です。
isempty([vsArray(2:10).Value])
ans =
1MATLAB では、オブジェクト配列プロパティ値の割り当てにスカラー式は適用できません。この処理には、関数 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 10vsArray(1).Value(6)
ans =
6size または numel の動作の変更
組み込み数値クラスのサブクラスは、size メソッドを継承します。このメソッド (非表示) は、サブクラス オブジェクトのスーパークラスの部分を処理します。size または numel に他の動作をさせる場合、ユーザーのサブクラス内で size または numel メソッドを定義してオーバーライドします。
他の MATLAB 関数はこれらの関数によって返された値を使用します。size と numel の動作を変更する場合、返される値が、ユーザー クラスが目的とした使用において意味をもつことを確認します。
numel の代わりに numArgumentsFromSubscript をオーバーロード
クラスで numArgumentsFromSubscript メソッドを実装する場合、MATLAB は numel の代わりにそれを呼び出して、コンマ区切りリストを返すインデックス式から返される要素数を決定します。たとえば、次のような式です。
A(1:2).Prop
subsref と subsasgn は、以下のように numArgumentsFromSubscript を使用します。
組み込みクラスのサブクラスは、添字による参照の結果としてスカラー オブジェクトを返し、添字による割り当てに対してスカラー オブジェクトを使用します。
subsref の nargout または subsasgn の nargin が特定の値でなければならないクラスを定義する場合、numArgumentsFromSubscript をオーバーロードしてそれらの値を返します。