プロパティなしの組み込み型のサブクラス
特殊な数値型
組み込み数値型をサブクラス化して、組み込み型の機能を継承するカスタマイズされたデータ型を作成します。クラス メソッドを実装することによって、スーパークラスによって提供された機能に機能を追加します。プロパティなしのサブクラスは、数値データをスーパークラスの型で格納します。サブクラスの設計により、その他のデータを格納するためのプロパティが必要ない場合、インデックス付けおよび連結メソッドを定義する必要がないため、実装はより単純になります。
詳細については、MATLAB 組み込み型のサブクラスを参照してください。
uint8 データを管理するクラス
この例では、組み込みの uint8
クラスから派生したクラスを示します。このクラスは、uint8
値で定義されている強度イメージのデータの集合を維持するプロセスを簡素化します。クラスの基本的な操作には、次のようなものがあります。
オブジェクト データ ストレージを減らすために、さまざまなクラスのイメージ データを
uint8
に変換する機能。サブクラス オブジェクトに含まれる強度イメージを表示するメソッド
uint8
データでサポートされるすべてのメソッドを使用する機能 (たとえば、size
、インデックス付け、reshape
、bitshift
、cat
、fft
、算術演算子など)。
クラスのデータは、サブクラス オブジェクトのスーパークラスの部分に格納されている強度イメージ データの行列になります。この方法では、プロパティは必要ありません。
次のように、DocUint8
クラスでイメージのデータを格納し、必要に応じてデータを変換します。
classdef DocUint8 < uint8 methods function obj = DocUint8(data) if nargin == 0 data = uint8(0); end obj = obj@uint8(data); % Store data on superclass end function h = showImage(obj) data = uint8(obj); figure; colormap(gray(256)) h = imagesc(data,[0 255]); axis image brighten(.2) end end end
DocUint8 クラスの使用
DocUint8 オブジェクトの作成
DocUint8
クラスは、DocUint8
オブジェクトとして保存されたすべてのイメージを一貫した方法で表示するメソッドを提供します。たとえば、次のようになります。
cir = imread('circuit.tif');
img1 = DocUint8(cir);
img1.showImage;
DocUint8
は、uint8
のサブクラスなので、任意の uint8
メソッドを使用できます。たとえば、
size(img1)
ans = 280 272
は、イメージ データのサイズを返します。
インデックス付けの操作
継承されたメソッドは、インデックス付けの操作を実行しますが、同じクラスのオブジェクトをサブクラスとして返します。
したがって、次のようにして、イメージのデータにインデックスを付け、サブクラスのメソッドを呼び出せます。
showImage(img1(100:200,1:160));
添字による参照の操作 (継承された subsref
メソッドにより制御される) は、DocUint8
オブジェクトを返します。
インデックス付けされた要素に値を割り当てることができます。
img1(100:120,140:160) = 255; img1.showImage;
添字による割り当ての操作 (継承された subsasgn
メソッドにより制御される) は、DocUint8
オブジェクトを返します。
連結操作
DocUint8
クラスは、DocUint8
オブジェクトを返し、uint8
の horzcat
と vertcat
メソッドを継承するので、連結操作は DocUint8
オブジェクトに機能します。
showImage([img1 img1]);
データ操作
算術演算子のように、データ値に操作するメソッドは、サブクラス タイプではなく組み込みタイプのオブジェクトを返します。たとえば、DocUint8
オブジェクトを乗算すると uint8
オブジェクトが返されるため、showImage
を呼び出すとエラーがスローされます。
a = img1.*1.8; showImage(a);
Check for missing argument or incorrect argument data type in call to function 'showImage'.
このような演算を実行するには、サブクラス メソッドを実装して、継承されたメソッドをオーバーライドします。times
メソッドは、(要素ごとの) 配列乗算を実装します。
このメソッドを DocUint8
クラスに追加します。
function o = times(obj,val) u8 = uint8(obj).*val; o = DocUint8(u8); end
uint8
のメソッドをオーバーライドすると、MATLAB® は基底クラスのメソッドではなくサブクラスのメソッドを呼び出します。サブクラス メソッドは以下を行わなければなりません。
DocUint8
オブジェクト データに対しuint8
のtimes
メソッドを呼び出す。uint8
データを使用して新しいDocUint8
オブジェクトを構成する。
DocUint8
クラスに times
メソッドを追加した後、乗算式の出力は DocUint8
クラスのオブジェクトになります。
showImage(img1.*1.8);