Main Content

运算符重载

为什么重载运算符

通过实现适合您的类的运算符,您可以将您的类的对象集成到 MATLAB® 语言中。例如,包含数值数据的对象可以定义算术运算,如 +*-,以便在算术表达式中使用这些对象。通过实现关系运算符,您可以在条件语句(如 switchif 语句)中使用对象。

如何定义运算符

您可以实现 MATLAB 运算符来处理您的类的对象。要实现运算符,请定义关联的类方法。

每个运算符都有关联的函数(例如,+ 运算符有关联的 plus.m 函数)。您可以通过创建具有适当名称的类方法来实现任何运算符。此方法可以执行适合将实现的运算的任何步骤。

有关运算符和关联的函数名称的列表,请参阅 MATLAB 运算符和关联的函数

运算中的对象优先级

用户定义的类优先于内置类。例如,假设 qdouble 类的对象,p 是用户定义的类。以下两个表达式都会在用户定义的类(如果存在)中生成对 plus 方法的调用:

q + p 
p + q

此方法是否可以添加 double 类和用户定义的类的对象取决于您如何实现该方法。

pq 是不同类的对象时,MATLAB 应用优先级规则来确定使用哪个方法。

有关 MATLAB 如何确定调用哪个方法的详细信息,请参阅方法调用

运算符优先级

重载运算符保留运算符的原始 MATLAB 优先级。有关运算符优先级的信息,请参阅运算符优先级

示例实现 - 可相加对象

Adder 类通过定义 plus 方法来实现此类的对象的相加。Adder 将对象的相加定义为 NumericData 属性值的相加。plus 方法构造并返回一个 Adder 对象,该对象的 NumericData 属性值是执行相加的结果。

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

使用双精度转换器,您可以将数值添加到 Adder 对象中,并对类的对象执行相加。

a = Adder(1:10)
a = 

  Adder with properties:

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

将两个对象相加:

a + a
ans = 

  Adder with properties:

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

加上一个对象,该对象具有可转换为双精度的任意值:

b = uint8(255) + a
b = 

  Adder with properties:

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

使用 < 运算符比较对象 ab

a < b
ans =

     1

确保您的类提供实现类设计所需的任何错误检查。

MATLAB 运算符和关联的函数

下表列出了 MATLAB 运算符的对应函数名称。实现运算符以处理数组(标量扩展、向量化算术运算等)时,可能还需要修改索引和串联方式。使用下表中的链接可了解关于每个函数的具体信息。

运算

要定义的方法

描述

a + b

plus(a,b)

二元加法

a - b

minus(a,b)

二元减法

-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)

下标索引

相关主题