クラスの end
のオーバーロード
標準 MATLAB® インデックス式では、end
は end
がある次元の最後の要素のインデックス値を返します。たとえば、A(4,end)
では、end
メソッドは A
の 2 番目の次元の最後の要素のインデックスを返します。特化した動作のためにクラスで end
をオーバーロードできます。
構文と既定の動作
これは、MATLAB で end
メソッドの呼び出しに使用される構文です。
ind = end(A,k,n)
A
はインデックスを付けるオブジェクトです。k
はend
があるインデックス式の次元です。n
は、式内のインデックス総数です。ind
は、式内で使用されるインデックス値です。
メモ
この構文を使用して end
メソッドを直接呼び出すことはできません。MATLAB は、インデックス式で end が検出されたときにこのメソッドを自動的に呼び出します。
たとえば、A
が double の 2 行 3 列の配列であるとします。MATLAB で式 A(end,1)
が検出されると、次の引数を指定して end
メソッドが呼び出されます。
end(A,1,2)
A
はオブジェクトです。end
がインデックス式の最初の次元にあるため、k = 1
です。式に 2 つのインデックスが含まれているため、
n = 2
です。
end
メソッドは 2
を返します。これは、A
の最初の次元における最後の要素のインデックスです。
RedefinesParen
が end
をオーバーロードする方法
end
メソッドのオーバーロードでは、呼び出し構文 ind = end(A,k,n)
が含まれている必要があります。たとえば、モジュール インデックス クラス matlab.mixin.indexing.RedefinesParen
には end
の組み込みのオーバーロードがあります。
function ind = end(obj,k,n) sz = size(obj); if k < n ind = sz(k); else ind = prod(sz(k:end)); end end
if-else
ステートメントは、end
がインデックス式のどこにあるのか、およびインデックス式にオブジェクト配列のすべての次元に対する値が含まれているかどうかに基づいて戻り値を計算します。たとえば、B
が、RedefinesParen
から継承した型の 2×3×2 のオブジェクト配列である場合は、次のようになります。k < n
:end
がインデックス式の最後の値でない場合、オーバーロードはその次元の最後の値を返します。B(1,end,4)
の場合、end
は 2 番目の次元のサイズ3
を返します。k = n
:end
がインデックス式の最後の要素の場合、オーバーロードで次の 2 つのケースが処理されます。インデックス式ですべてのインデックスが参照されている場合、
prod(sz(k:end))
ではsz(k)
と同じ結果が得られます。たとえば、B(1,2,end)
ではend
は2
を返します。インデックス式で一部のインデックスが参照されていない場合、
prod(sz(k:end))
は次元k
のサイズと参照されていないすべての次元のサイズの総乗を返します。たとえば、B(1,end)
では、end
は 2 番目の次元のサイズと 3 番目の次元のサイズの総乗6
を返します。
RedefinesParen
はクラス作成者が実装する抽象メソッドとして size
を定義します。そのため、2 つのメソッドは最終的な動作では互いに独立しています。配列で予期される end
の動作を提供する size
メソッドを実装するクラスについて、Customize Parentheses Indexingの例を参照してください。