クラスの 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の例を参照してください。