クラスでの 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 = 10
dsub = d(7:end); size(dsub)
ans = 1 4
double
クラスは、小かっこインデックス生成を含むこれらの動作を定義します。
サブクラスでの動作の継承
サブクラスでスーパークラスの動作を明示的にオーバーライドしない限り、サブクラスはそのスーパークラスと同じように動作します。たとえば、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 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 関数はこれらの関数によって返された値を使用します。size
と numel
の動作を変更する場合、返される値が、ユーザー クラスが目的とした使用において意味をもつことを確認します。
numel の代わりに numArgumentsFromSubscript をオーバーロード
クラスで numArgumentsFromSubscript
メソッドを実装する場合、MATLAB は numel
の代わりにそれを呼び出して、コンマ区切りリストを返すインデックス式から返される要素数を決定します。たとえば、次のような式です。
A(1:2).Prop
subsref
と subsasgn
は、以下のように numArgumentsFromSubscript
を使用します。
組み込みクラスのサブクラスは、添字による参照の結果としてスカラー オブジェクトを返し、添字による割り当てに対してスカラー オブジェクトを使用します。
subsref
の nargout
または subsasgn
の nargin
が特定の値でなければならないクラスを定義する場合、numArgumentsFromSubscript
をオーバーロードしてそれらの値を返します。