Main Content

演算子のオーバーロード

演算子をオーバーロードする理由

クラスに適した演算子を実装することにより、クラスのオブジェクトを MATLAB® 言語に統合することができます。たとえば、数値データを含むオブジェクトは、これらのオブジェクトを算術式で使用できるように +*- などの算術演算を定義できます。関係演算子を実装することにより、switch ステートメントや if ステートメントなどの条件付きステートメントでオブジェクトを使用することができます。

演算子の定義方法

MATLAB 演算子を実装すると、クラスのオブジェクトを処理できます。演算子を実装するには、関連するクラス メソッドを定義します。

各演算子には、それぞれ関数が関連付けられています。たとえば、+ 演算子には関数 plus.m が関連します。適切な名前をもつクラス メソッドを作成することによって、任意の演算子を実装できます。このメソッドでは、実装される演算に適した手順を実行できます。

演算子と関連付けられている関数名のリストについては、MATLAB 演算子と関連する関数を参照してください。

演算でのオブジェクトの優先順位

ユーザー定義のクラスは、組み込みクラスよりも優先順位が高くなります。たとえば、q がクラス double のオブジェクトであり、p がユーザー定義クラスのオブジェクトであるとします。ユーザー定義クラスに plus メソッドが存在する場合、次の 2 つの式はそのメソッドへの呼び出しを生成します。

q + p 
p + q

このメソッドがクラス double のオブジェクトとユーザー定義クラスのオブジェクトを加算できるかどうかは、このメソッドを実装する方法に依存します。

pq が異なるクラスのオブジェクトである場合、MATLAB は優先順位則を適用して、使用するメソッドを決定します。

MATLAB がどのメソッドを呼び出すかを決める方法の詳細については、メソッドの呼び出しを参照してください。

演算子の優先順位

オーバーロードされた演算子は、その演算子の元の MATLAB 優先順位を保持します。演算子の優先順位の詳細については、演算子の優先順位を参照してください。

サンプル実装 — 加算可能なオブジェクト

Adder クラスは plus メソッドを定義することにより、このクラスのオブジェクトの加算を実装します。Adder はオブジェクトの加算を NumericData プロパティ値の加算として定義します。plus メソッドは、NumericData プロパティ値が加算の結果となる Adder オブジェクトを作成して返します。

また、Adder クラスは、lt メソッドを定義して "より小" の演算子 (<) を実装します。lt メソッドは、各オブジェクトの NumericData プロパティの値を比較した後に論理値を返します。

classdef Adder
   properties
      NumericData
   end
   methods
      function obj = Adder(val)
         obj.NumericData = val;
      end
      function r = plus(obj1,obj2)
         a = double(obj1);
         b = double(obj2);
         r = Adder(a + b);
      end
      function d = double(obj)
         d = obj.NumericData;
      end
      function tf = lt(obj1,obj2)
         if obj1.NumericData < obj2.NumericData
            tf = true;
         else
            tf = false;
         end
      end
   end
end

double コンバーターを使用して Adder オブジェクトに数値を追加し、クラスのオブジェクトで加算を実行することができます。

a = Adder(1:10)
a = 

  Adder with properties:

    NumericData: [1 2 3 4 5 6 7 8 9 10]

2 つのオブジェクトを加算します。

a + a
ans = 

  Adder with properties:

    NumericData: [2 4 6 8 10 12 14 16 18 20]

double にキャストできる任意の値をもつオブジェクトを加算します。

b = uint8(255) + a
b = 

  Adder with properties:

    NumericData: [256 257 258 259 260 261 262 263 264 265]

< 演算子を使用して、オブジェクト a とオブジェクト b を比較します。

a < b
ans =

     1

ユーザー クラスの設計を実装するために必要なエラー チェックを、ユーザー クラスが提供していることを確認してください。

MATLAB 演算子と関連する関数

次の表は、MATLAB 演算子の関数名の一覧です。配列を扱う演算子 (スカラー拡張、ベクトル化された算術演算など) を実装するには、インデックスと連結の変更も必要となる場合があります。各関数の固有の情報を確認するには、次の表のリンクを使用してください。

演算

定義するメソッド

説明

a + b

plus(a,b)

2 項の加算

a - b

minus(a,b)

2 項の減算

-a

uminus(a)

単項マイナス

+a

uplus(a)

単項プラス

a.*b

times(a,b)

要素単位の乗算

a*b

mtimes(a,b)

行列乗算

a./b

rdivide(a,b)

要素単位の右除算

a.\b

ldivide(a,b)

要素単位の左除算

a/b

mrdivide(a,b)

行列の右除算

a\b

mldivide(a,b)

行列の左除算

a.^b

power(a,b)

要素単位のべき乗

a^b

mpower(a,b)

行列のべき乗

a < b

lt(a,b)

より小さい

a > b

gt(a,b)

より大きい

a <= b

le(a,b)

以下

a >= b

ge(a,b)

以上

a ~= b

ne(a,b)

等しくない

a == b

eq(a,b)

等しい

a & b

and(a,b)

論理 AND

a | b

or(a,b)

論理 OR

~a

not(a)

論理否定

a:d:b

a:b

colon(a,d,b)

colon(a,b)

コロン演算子

a'

ctranspose(a)

複素共役転置

a.'

transpose(a)

行列転置

[a b]

horzcat(a,b,...)

水平方向の連結

[a; b]

vertcat(a,b,...)

垂直方向の連結

a(s1,s2,...sn)

subsref(a,s)

添字を使った参照

a(s1,...,sn) = b

subsasgn(a,s,b)

添字を使った代入

b(a)

subsindex(a)

添字を使ったインデックス

関連するトピック