跳转至

矩阵算术 — 运算符重载

算术运算符

就地操作

本节定义了作用于当前矩阵本身的算术运算符(就地操作)。这些运算符修改矩阵并返回其引用,支持链式操作如A += B += C。这些运算符经过优化以处理填充,并在可用时使用DSP加速函数。

拷贝赋值

Mat &operator=(const Mat &src);

描述:

矩阵的拷贝赋值运算符。将源矩阵的元素复制到当前矩阵。必要时通过重新分配内存来处理维度变化。为防止意外数据损坏,禁止对子矩阵视图进行赋值。

数学原理:

创建源矩阵的独立副本。与拷贝构造函数不同,这用于现有矩阵。

参数:

  • const Mat &src : 源矩阵。

返回值:

Mat& - 对当前矩阵的引用(支持链式操作)。

使用建议:

  • 内存管理: 如果维度不同,自动重新分配内存。如果内存是内部分配的,释放旧内存。

  • 子矩阵保护: 禁止对子矩阵视图进行赋值,以防止意外数据损坏。

  • 自赋值: 安全处理自赋值 (A = A)。

  • 性能: 对于n×n矩阵为O(n²)。对于大矩阵,考虑视图是否足够。

加法运算符

Mat &operator+=(const Mat &A);

描述:

加法运算符,将源矩阵的元素加到当前矩阵。

参数:

  • const Mat &A: 源矩阵对象

加法运算符 - 常量

Mat &operator+=(float C);

描述:

将常量按元素加到当前矩阵。

参数:

  • float C: 要加的常量

返回值:

Mat& - 当前矩阵的引用

减法运算符

Mat &operator-=(const Mat &A);

描述:

从当前矩阵中按元素减去源矩阵。

参数:

  • const Mat &A: 源矩阵对象

返回值:

Mat& - 当前矩阵的引用

减法运算符 - 常量

Mat &operator-=(float C);

描述:

从当前矩阵中按元素减去常量。

参数:

  • float C: 要减的常量

返回值:

Mat& - 当前矩阵的引用

矩阵乘法

Mat &operator*=(const Mat &A);

描述:

矩阵乘法: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()()的循环。

乘法运算符 - 常量

Mat &operator*=(float C);

描述:

按元素乘以常量。

参数:

  • float C: 常量乘数

返回值:

Mat& - 当前矩阵的引用

除法运算符

Mat &operator/=(const Mat &B);

描述:

按元素除法:this = this / B

参数:

  • const Mat &B: 除数矩阵

返回值:

Mat& - 当前矩阵的引用

除法运算符 - 常量

Mat &operator/=(float C);

描述:

将当前矩阵按元素除以常量。

参数:

  • float C: 常量除数

返回值:

Mat& - 当前矩阵的引用

幂运算符

Mat operator^(int C);

描述:

按元素整数幂运算。返回一个新矩阵,其中每个元素都提升到给定幂次。

参数:

  • int C: 指数(整数)

返回值:

Mat - 幂运算后的新矩阵

流操作符

矩阵输出流操作符

std::ostream &operator<<(std::ostream &os, const Mat &m);

描述:

矩阵的重载输出流操作符。

参数:

  • std::ostream &os : 输出流。

  • const Mat &m : 要输出的矩阵。

ROI输出流操作符

std::ostream &operator<<(std::ostream &os, const Mat::ROI &roi);

描述:

ROI结构体的重载输出流操作符。

参数:

  • std::ostream &os : 输出流。

  • const Mat::ROI &roi : ROI结构。

矩阵输入流操作符

std::istream &operator>>(std::istream &is, Mat &m);

描述:

矩阵的重载输入流操作符。

参数:

  • std::istream &is : 输入流。

  • Mat &m : 要输入的矩阵。

Tip

本节实际上在显示矩阵方面与打印函数有些重叠。

全局算术运算符

非修改操作

本节中的运算符返回一个新的矩阵对象,作为运算结果。原始矩阵保持不变。这些是函数式操作,不修改其操作数,使其可以安全地与const引用和临时对象一起使用。

何时使用

  • 使用全局运算符 (A + B) 当您想保留原始矩阵时
  • 使用成员运算符 (A += B) 当您想就地修改矩阵时(更节省内存)

加法运算符

Mat operator+(const Mat &A, const Mat &B);

描述:

按元素将两个矩阵相加。

参数:

  • const Mat &A: 第一个矩阵

  • const Mat &B: 第二个矩阵

返回值:

Mat - 结果矩阵 A+B

加法运算符 - 常量

Mat operator+(const Mat &A, float C);

描述:

按元素将常量加到矩阵。

参数:

  • const Mat &A: 输入矩阵 A

  • float C: 输入常量

返回值:

Mat - 结果矩阵 A+C

减法运算符

Mat operator-(const Mat &A, const Mat &B);

描述:

按元素将两个矩阵相减。

参数:

  • const Mat &A: 第一个矩阵

  • const Mat &B: 第二个矩阵

返回值:

Mat - 结果矩阵 A-B

减法运算符 - 常量

Mat operator-(const Mat &A, float C);

描述:

按元素从矩阵中减去常量。

参数:

  • const Mat &A: 输入矩阵 A

  • float C: 输入常量

返回值:

Mat - 结果矩阵 A-C

乘法运算符

Mat operator*(const Mat &A, const Mat &B);

描述:

将两个矩阵相乘(矩阵乘法)。

参数:

  • const Mat &A: 第一个矩阵

  • const Mat &B: 第二个矩阵

返回值:

Mat - 结果矩阵 A*B

乘法运算符 - 常量

Mat operator*(const Mat &A, float C);

描述:

按元素将矩阵乘以常量。

参数:

  • const Mat &A: 输入矩阵 A

  • float C: 浮点数值

返回值:

Mat - 结果矩阵 A*C

乘法运算符 - 常量(左侧)

Mat operator*(float C, const Mat &A);

描述:

按元素将常量乘以矩阵。

参数:

  • float C: 浮点数值

  • const Mat &A: 输入矩阵 A

返回值:

Mat - 结果矩阵 C*A

除法运算符

Mat operator/(const Mat &A, float C);

描述:

按元素将矩阵除以常量。

参数:

  • const Mat &A: 输入矩阵 A

  • float C: 浮点数值

返回值:

Mat - 结果矩阵 A/C

除法运算符 - 矩阵

Mat operator/(const Mat &A, const Mat &B);

描述:

按元素将矩阵 A 除以矩阵 B。

参数:

  • const Mat &A: 输入矩阵 A

  • const Mat &B: 输入矩阵 B

返回值:

Mat - 结果矩阵 C,其中 C[i,j] = A[i,j]/B[i,j]

等于运算符

bool operator==(const Mat &A, const Mat &B);

描述:

等于运算符,检查两个矩阵是否相等。

参数:

  • const Mat &A: 第一个矩阵对象

  • const Mat &B: 第二个矩阵对象

返回值:

布尔值,表示两个矩阵是否相等