c++ 写一个矩阵,此矩阵可以自由定义和参数设置,同时两个任意大小矩阵的加、减、乘、除完整计算过程。
时间: 2024-10-06 13:04:58 浏览: 29
在C++中,你可以创建一个模板类来表示动态大小的矩阵,然后提供加、减、乘、除等操作。下面是一个简单的例子,我们使用二维向量容器 `std::vector<std::vector<double>>` 来存储矩阵元素,并添加必要的运算符重载。
```cpp
#include <vector>
class Matrix {
private:
size_t rows, cols;
std::vector<std::vector<double>> data;
public:
// 构造函数接受行数和列数
Matrix(size_t r, size_t c) : rows(r), cols(c) {}
// 初始化全零矩阵
void initZero() {
data.resize(rows, std::vector<double>(cols, 0));
}
// 设置指定位置的元素
void setElement(int row, int col, double value) {
if (row >= 0 && row < rows && col >= 0 && col < cols)
data[row][col] = value;
else
throw std::out_of_range("Invalid matrix index");
}
// 返回矩阵大小
std::pair<size_t, size_t> getDimensions() const {
return {rows, cols};
}
// 运算符重载:加法
friend Matrix operator+(const Matrix& m1, const Matrix& m2) {
if (m1.getDimensions() != m2.getDimensions())
throw std::invalid_argument("Matrices must have the same dimensions for addition.");
Matrix result(m1.rows, m1.cols);
result.data = m1.data; // 深拷贝
for (size_t i = 0; i < result.rows; ++i)
for (size_t j = 0; j < result.cols; ++j)
result.data[i][j] += m2.data[i][j];
return result;
}
// 运算符重载:减法
friend Matrix operator-(const Matrix& m1, const Matrix& m2) {
// 类似于加法,只需改变操作
return m1 + (-m2);
}
// 运算符重载:矩阵乘法
friend Matrix operator*(const Matrix& m1, const Matrix& m2) {
if (m1.cols != m2.rows)
throw std::invalid_argument("Matrix dimensions not compatible for multiplication.");
Matrix result(m1.rows, m2.cols);
for (size_t i = 0; i < result.rows; ++i)
for (size_t j = 0; j < result.cols; ++j)
for (size_t k = 0; k < m1.cols; ++k)
result.data[i][j] += m1.data[i][k] * m2.data[k][j];
return result;
}
// 简单的除法,假设矩阵是对角线元素不为零的方阵
Matrix divideByDiagonal() const {
Matrix identity(rows, cols);
for (size_t i = 0; i < rows; ++i)
identity.setElement(i, i, 1.0 / data[i][i]);
return *this * identity;
}
// 打印矩阵
void print() const {
for (const auto &row : data)
for (double val : row)
std::cout << val << " ";
std::cout << '\n';
}
};
// 使用示例
int main() {
Matrix m1(3, 3), m2(3, 3);
// 初始化矩阵...
m1.print(); // 打印m1
m2.print(); // 打印m2
Matrix sum = m1 + m2;
Matrix diff = m1 - m2;
Matrix product = m1 * m2;
try {
Matrix division = m1.divideByDiagonal();
division.print();
} catch (const std::exception &e) {
std::cerr << e.what() << std::endl;
}
return 0;
}
```
请注意,上述代码中的除法仅适用于对角线元素不为零的方阵,对于一般情况下的矩阵除法(如通用逆矩阵),需要更复杂的算法。此外,这个简单的版本也没有处理除数为零的异常情况。在实际应用中,你需要根据需求进一步完善。
阅读全文