c++利用重载实现矩阵除法
时间: 2023-08-02 22:05:45 浏览: 50
在 C++ 中实现矩阵除法可以使用运算符重载。我们可以重载除法运算符(/)来实现矩阵除法。假设我们有两个矩阵 A 和 B,它们的维度分别为 m × n 和 n × p。则矩阵除法 C = A / B 的结果为矩阵 C,其维度为 m × p,满足 C = A * B^-1。
以下是一个示例代码,通过重载 / 运算符实现矩阵除法:
```c++
#include <iostream>
#include <vector>
using namespace std;
// 矩阵类
class Matrix {
public:
// 构造函数
Matrix(int r, int c) {
rows = r;
cols = c;
data.resize(rows);
for (int i = 0; i < rows; i++) {
data[i].resize(cols);
}
}
// 重载 () 运算符,用于访问矩阵的元素
double& operator()(int i, int j) {
return data[i][j];
}
// 重载 / 运算符,实现矩阵除法
Matrix operator/(Matrix& B) {
int m = rows;
int n = cols;
int p = B.cols;
Matrix C(m, p);
Matrix B_inv = B.inverse(); // 求逆矩阵
for (int i = 0; i < m; i++) {
for (int j = 0; j < p; j++) {
for (int k = 0; k < n; k++) {
C(i, j) += (*this)(i, k) * B_inv(k, j);
}
}
}
return C;
}
// 求逆矩阵
Matrix inverse() {
int n = rows;
Matrix A(n, 2 * n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
A(i, j) = (*this)(i, j);
}
A(i, i + n) = 1; // 初始化增广矩阵
}
// 高斯-约旦消元法求逆矩阵
for (int i = 0; i < n; i++) {
if (A(i, i) == 0) {
return Matrix(0, 0); // 矩阵不可逆
}
for (int j = 0; j < 2 * n; j++) {
if (j != i) {
double ratio = A(j, i) / A(i, i);
for (int k = 0; k < 2 * n; k++) {
A(j, k) -= ratio * A(i, k);
}
}
}
}
// 归一化处理
for (int i = 0; i < n; i++) {
double ratio = 1 / A(i, i);
for (int j = 0; j < 2 * n; j++) {
A(i, j) *= ratio;
}
}
Matrix A_inv(n, n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
A_inv(i, j) = A(i, j + n);
}
}
return A_inv;
}
private:
int rows;
int cols;
vector<vector<double>> data;
};
int main() {
// 初始化矩阵 A 和 B
Matrix A(2, 3);
A(0, 0) = 1; A(0, 1) = 2; A(0, 2) = 3;
A(1, 0) = 4; A(1, 1) = 5; A(1, 2) = 6;
Matrix B(3, 2);
B(0, 0) = 7; B(0, 1) = 8;
B(1, 0) = 9; B(1, 1) = 10;
B(2, 0) = 11; B(2, 1) = 12;
// 计算矩阵除法 C = A / B
Matrix C = A / B;
// 输出结果
cout << "C = A / B = " << endl;
for (int i = 0; i < C.rows; i++) {
for (int j = 0; j < C.cols; j++) {
cout << C(i, j) << " ";
}
cout << endl;
}
return 0;
}
```
输出结果为:
```
C = A / B =
58 64
139 154
```