目录
运算符重载
为什么重载运算符
通过实现适合类的运算符,可以将类的对象集成到 MATLAB® 语言中。例如,包含数值数据的对象可以定义算术运算,如 +、*、-,以便在算术表达式中使用这些对象。通过实现关系运算符,可以在条件语句(如 switch 和 if 语句)中使用对象。
如何定义运算符
可以实现 MATLAB 运算符来处理您的类的对象。要实现运算符,请定义关联的类方法。
每个运算符都有关联的函数(例如,+ 运算符有关联的 plus.m 函数)。可以通过创建具有适当名称的类方法来实现任何运算符。此方法可以执行适合将实现的运算的任何步骤。
运算中的对象优先级
用户定义的类优先于内置类。例如,假设 q 是 double 类的对象,p 是用户定义的类。以下两个表达式都会在用户定义的类(如果存在)中生成对 plus 方法的调用:
q + p
p + q
此方法是否可以添加 double 类和用户定义的类的对象取决于如何实现该方法。当 p 和 q 是不同类的对象时,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 运算符的对应函数名称。实现运算符以处理数组(标量扩展、向量化算术运算等)时,可能还需要修改索引和串联方式。使用下表中的链接可了解关于每个函数的具体信息。
运算 | 要定义的方法 | 说明 |
---|---|---|
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 | Idivide(a,b) | 左按元素除法 |
| mrdivide(a,b) | 矩阵右除 |
a\b | mIdivide(a,b) | 矩阵左除 |
a.^b | power(a,b) | 按元素求幂 |
a^b | mpower(a,b) | 矩阵幂 |
a < b | It(a,b) | 小于 |
a > b | gt(a,b) | 大于 |
a <= b | Ie(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,b) | 逻辑非 |
a:d:b a:b | colon(a,d,b) colon(a,b) | 冒号运算符 |
a' | ctransport(a) | 复共轭转置 |
a.' | transport(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) | 下标索引 |