Main Content

プロパティなしの組み込み型のサブクラス

特殊な数値型

組み込み数値型をサブクラス化して、組み込み型の機能を継承するカスタマイズされたデータ型を作成します。クラス メソッドを実装することによって、スーパークラスによって提供された機能に機能を追加します。プロパティなしのサブクラスは、数値データをスーパークラスの型で格納します。サブクラスの設計により、その他のデータを格納するためのプロパティが必要ない場合、インデックス付けおよび連結メソッドを定義する必要がないため、実装はより単純になります。

詳細については、MATLAB 組み込み型のサブクラスを参照してください。

uint8 データを管理するクラス

この例では、組み込みの uint8 クラスから派生したクラスを示します。このクラスは、uint8 値で定義されている強度イメージのデータの集合を維持するプロセスを簡素化します。クラスの基本的な操作には、次のようなものがあります。

  • オブジェクト データ ストレージを減らすために、さまざまなクラスのイメージ データを uint8 に変換する機能。

  • サブクラス オブジェクトに含まれる強度イメージを表示するメソッド

  • uint8 データでサポートされるすべてのメソッドを使用する機能 (たとえば、size、インデックス付け、reshapebitshiftcatfft、算術演算子など)。

クラスのデータは、サブクラス オブジェクトのスーパークラスの部分に格納されている強度イメージ データの行列になります。この方法では、プロパティは必要ありません。

次のように、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;

Grayscale image of a circuit

DocUint8 は、uint8 のサブクラスなので、任意の uint8 メソッドを使用できます。以下に例を示します。

size(img1)
ans =
   280   272

は、イメージ データのサイズを返します。

インデックス付けの操作

継承されたメソッドは、インデックス付けの操作を実行しますが、同じクラスのオブジェクトをサブクラスとして返します。

したがって、次のようにして、イメージのデータにインデックスを付け、サブクラスのメソッドを呼び出せます。

showImage(img1(100:200,1:160));

添字による参照の操作 (継承された subsref メソッドにより制御される) は、DocUint8 オブジェクトを返します。

Grayscale image of a circuit, cropped

インデックス付けされた要素に値を割り当てることができます。

img1(100:120,140:160) = 255;
img1.showImage;

添字による割り当ての操作 (継承された subsasgn メソッドにより制御される) は、DocUint8 オブジェクトを返します。

Grayscale image of a circuit with a white box replacing a portion of the original

連結操作

DocUint8 クラスは、DocUint8 オブジェクトを返し、uint8horzcat メソッドと vertcat メソッドを継承するので、連結操作は DocUint8 オブジェクトに機能します。

showImage([img1 img1]);

Two copies of a circuit image concatenated horizontally

データ操作

算術演算子のように、データ値に操作するメソッドは、サブクラス タイプではなく組み込みタイプのオブジェクトを返します。たとえば、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 オブジェクト データに対し uint8times メソッドを呼び出す。

  • uint8 データを使用して新しい DocUint8 オブジェクトを構成する。

DocUint8 クラスに times メソッドを追加した後、乗算式の出力は DocUint8 クラスのオブジェクトになります。

showImage(img1.*1.8);

Image of a circuit after values have been multiplied by 1.8

関連するトピック