矩阵算术 — 运算符重载¶
算术运算符¶
就地操作
本节定义了作用于当前矩阵本身的算术运算符(就地操作)。这些运算符修改矩阵并返回其引用,支持链式操作如A += B += C。这些运算符经过优化以处理填充,并在可用时使用DSP加速函数。
拷贝赋值¶
描述:
矩阵的拷贝赋值运算符。将源矩阵的元素复制到当前矩阵。必要时通过重新分配内存来处理维度变化。为防止意外数据损坏,禁止对子矩阵视图进行赋值。
数学原理:
创建源矩阵的独立副本。与拷贝构造函数不同,这用于现有矩阵。
参数:
const Mat &src: 源矩阵。
返回值:
Mat& - 对当前矩阵的引用(支持链式操作)。
使用建议:
-
内存管理: 如果维度不同,自动重新分配内存。如果内存是内部分配的,释放旧内存。
-
子矩阵保护: 禁止对子矩阵视图进行赋值,以防止意外数据损坏。
-
自赋值: 安全处理自赋值 (A = A)。
-
性能: 对于n×n矩阵为O(n²)。对于大矩阵,考虑视图是否足够。
加法运算符¶
描述:
加法运算符,将源矩阵的元素加到当前矩阵。
参数:
const Mat &A: 源矩阵对象
加法运算符 - 常量¶
描述:
将常量按元素加到当前矩阵。
参数:
float C: 要加的常量
返回值:
Mat& - 当前矩阵的引用
减法运算符¶
描述:
从当前矩阵中按元素减去源矩阵。
参数:
const Mat &A: 源矩阵对象
返回值:
Mat& - 当前矩阵的引用
减法运算符 - 常量¶
描述:
从当前矩阵中按元素减去常量。
参数:
float C: 要减的常量
返回值:
Mat& - 当前矩阵的引用
矩阵乘法¶
描述:
矩阵乘法:this = this * A。执行标准矩阵乘法(非逐元素)。当前矩阵的列数必须等于A的行数。
数学原理:
矩阵乘法 C = A * B,其中 Cᵢⱼ = Σₖ Aᵢₖ * Bₖⱼ。这是标准矩阵乘积,不是逐元素乘法。
维度要求:
-
当前矩阵: m × n
-
矩阵 A: n × p
-
结果: m × p
参数:
const Mat &A: 要乘的矩阵(必须有n行,其中n = 当前矩阵的列数)。
返回值:
Mat& - 对当前矩阵的引用。
使用建议:
-
内存效率: 创建临时副本以避免在计算期间覆盖数据,然后更新当前矩阵。
-
填充支持: 在可用时使用专用DSP函数处理带填充的矩阵。
-
性能: 对于m×n * n×p乘法为O(mnp)。在ESP32平台上使用优化的DSP函数。
-
常见错误: 这是矩阵乘法,不是逐元素的。对于逐元素,使用带有
operator()()的循环。
乘法运算符 - 常量¶
描述:
按元素乘以常量。
参数:
float C: 常量乘数
返回值:
Mat& - 当前矩阵的引用
除法运算符¶
描述:
按元素除法:this = this / B
参数:
const Mat &B: 除数矩阵
返回值:
Mat& - 当前矩阵的引用
除法运算符 - 常量¶
描述:
将当前矩阵按元素除以常量。
参数:
float C: 常量除数
返回值:
Mat& - 当前矩阵的引用
幂运算符¶
描述:
按元素整数幂运算。返回一个新矩阵,其中每个元素都提升到给定幂次。
参数:
int C: 指数(整数)
返回值:
Mat - 幂运算后的新矩阵
流操作符¶
矩阵输出流操作符¶
描述:
矩阵的重载输出流操作符。
参数:
-
std::ostream &os: 输出流。 -
const Mat &m: 要输出的矩阵。
ROI输出流操作符¶
描述:
ROI结构体的重载输出流操作符。
参数:
-
std::ostream &os: 输出流。 -
const Mat::ROI &roi: ROI结构。
矩阵输入流操作符¶
描述:
矩阵的重载输入流操作符。
参数:
-
std::istream &is: 输入流。 -
Mat &m: 要输入的矩阵。
Tip
本节实际上在显示矩阵方面与打印函数有些重叠。
全局算术运算符¶
非修改操作
本节中的运算符返回一个新的矩阵对象,作为运算结果。原始矩阵保持不变。这些是函数式操作,不修改其操作数,使其可以安全地与const引用和临时对象一起使用。
何时使用
- 使用全局运算符 (A + B) 当您想保留原始矩阵时
- 使用成员运算符 (A += B) 当您想就地修改矩阵时(更节省内存)
加法运算符¶
描述:
按元素将两个矩阵相加。
参数:
-
const Mat &A: 第一个矩阵 -
const Mat &B: 第二个矩阵
返回值:
Mat - 结果矩阵 A+B
加法运算符 - 常量¶
描述:
按元素将常量加到矩阵。
参数:
-
const Mat &A: 输入矩阵 A -
float C: 输入常量
返回值:
Mat - 结果矩阵 A+C
减法运算符¶
描述:
按元素将两个矩阵相减。
参数:
-
const Mat &A: 第一个矩阵 -
const Mat &B: 第二个矩阵
返回值:
Mat - 结果矩阵 A-B
减法运算符 - 常量¶
描述:
按元素从矩阵中减去常量。
参数:
-
const Mat &A: 输入矩阵 A -
float C: 输入常量
返回值:
Mat - 结果矩阵 A-C
乘法运算符¶
描述:
将两个矩阵相乘(矩阵乘法)。
参数:
-
const Mat &A: 第一个矩阵 -
const Mat &B: 第二个矩阵
返回值:
Mat - 结果矩阵 A*B
乘法运算符 - 常量¶
描述:
按元素将矩阵乘以常量。
参数:
-
const Mat &A: 输入矩阵 A -
float C: 浮点数值
返回值:
Mat - 结果矩阵 A*C
乘法运算符 - 常量(左侧)¶
描述:
按元素将常量乘以矩阵。
参数:
-
float C: 浮点数值 -
const Mat &A: 输入矩阵 A
返回值:
Mat - 结果矩阵 C*A
除法运算符¶
描述:
按元素将矩阵除以常量。
参数:
-
const Mat &A: 输入矩阵 A -
float C: 浮点数值
返回值:
Mat - 结果矩阵 A/C
除法运算符 - 矩阵¶
描述:
按元素将矩阵 A 除以矩阵 B。
参数:
-
const Mat &A: 输入矩阵 A -
const Mat &B: 输入矩阵 B
返回值:
Mat - 结果矩阵 C,其中 C[i,j] = A[i,j]/B[i,j]
等于运算符¶
描述:
等于运算符,检查两个矩阵是否相等。
参数:
-
const Mat &A: 第一个矩阵对象 -
const Mat &B: 第二个矩阵对象
返回值:
布尔值,表示两个矩阵是否相等