运算符重载
为什么重载运算符
通过实现适合您的类的运算符,您可以将您的类的对象集成到 MATLAB® 语言中。例如,包含数值数据的对象可以定义算术运算,如 +
、*
、-
,以便在算术表达式中使用这些对象。通过实现关系运算符,您可以在条件语句(如 switch
和 if
语句)中使用对象。
如何定义运算符
您可以实现 MATLAB 运算符来处理您的类的对象。要实现运算符,请定义关联的类方法。
每个运算符都有关联的函数(例如,+ 运算符有关联的 plus.m
函数)。您可以通过创建具有适当名称的类方法来实现任何运算符。此方法可以执行适合将实现的运算的任何步骤。
有关运算符和关联的函数名称的列表,请参阅 MATLAB 运算符和关联的函数。
运算中的对象优先级
用户定义的类优先于内置类。例如,假设 q
是 double
类的对象,p
是用户定义的类。以下两个表达式都会在用户定义的类(如果存在)中生成对 plus
方法的调用:
q + p p + q
此方法是否可以添加 double
类和用户定义的类的对象取决于您如何实现该方法。
当 p
和 q
是不同类的对象时,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]
使用 <
运算符比较对象 a
和 b
:
a < b
ans = 1
确保您的类提供实现类设计所需的任何错误检查。
MATLAB 运算符和关联的函数
下表列出了 MATLAB 运算符的对应函数名称。实现运算符以处理数组(标量扩展、向量化算术运算等)时,可能还需要修改索引和串联方式。使用下表中的链接可了解关于每个函数的具体信息。
运算 | 要定义的方法 | 描述 |
---|---|---|
|
| 二元加法 |
|
| 二元减法 |
|
| 一元减法 |
|
| 一元加法 |
|
| 按元素乘法 |
|
| 矩阵乘法 |
|
| 右按元素除法 |
|
| 左按元素除法 |
|
| 矩阵右除 |
|
| 矩阵左除 |
|
| 按元素求幂 |
|
| 矩阵幂 |
|
| 小于 |
|
| 大于 |
| le (a,b) | 小于或等于 |
| ge (a,b) | 大于或等于 |
| ne (a,b) | 不等于 |
| eq (a,b) | 相等性 |
| and (a,b) | 逻辑 AND |
| or (a,b) | 逻辑或 |
| not (a) | 逻辑非 |
|
| 冒号运算符 |
|
| 复共轭转置 |
|
| 矩阵转置 |
|
| 水平串联 |
|
| 垂直串联 |
|
| 下标引用 |
|
| 通过下标赋值 |
|
| 下标索引 |