运算符重载
为什么重载运算符
通过实现适合您的类的运算符,您可以将您的类的对象集成到 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) | 逻辑非 |
|
| 冒号运算符 |
|
| 复共轭转置 |
|
| 矩阵转置 |
|
| 水平串联 |
|
| 垂直串联 |
|
| 下标引用 |
|
| 通过下标赋值 |
|
| 下标索引 |