ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

演算子のオーバーロード

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

クラスに適した演算子を実装することにより、クラスのオブジェクトを 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)

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

関連するトピック