#include <iostream>
#include <vector>
class Matrix {
private:
std::vector<std::vector<int>> data;
int rows;
int cols;
public:
Matrix(int r, int c) : rows(r), cols(c), data(r, std::vector<int>(c, 0)) {}
// 获取矩阵的行数
int getRows() const {
return rows;
}
// 获取矩阵的列数
int getCols() const {
return cols;
}
// 获取矩阵的元素
int getElement(int i, int j) const {
return data[i][j];
}
// 设置矩阵的元素
void setElement(int i, int j, int value) {
data[i][j] = value;
}
// 重载乘法运算符
Matrix operator*(const Matrix& other) const {
if (cols != other.rows) {
throw std::invalid_argument("矩阵维度不匹配,无法相乘");
}
Matrix result(rows, other.cols);
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < other.cols; ++j) {
for (int k = 0; k < cols; ++k) {
result.data[i][j] += data[i][k] * other.data[k][j];
}
}
}
return result;
}
};
可能遇到的错误及避免方法:
- 矩阵维度不匹配:
- 错误描述:当左矩阵的列数与右矩阵的行数不相等时,矩阵乘法无法进行。
- 避免方法:在重载的
operator*
函数中,首先检查左矩阵的列数(cols
)是否等于右矩阵的行数(other.rows
)。如果不相等,抛出std::invalid_argument
异常提示维度不匹配。
- 内存分配失败:
- 错误描述:在创建结果矩阵
result
时,如果内存分配失败(例如系统内存不足),会导致程序崩溃。
- 避免方法:使用
try - catch
块捕获std::bad_alloc
异常,在异常处理中进行适当的错误处理,比如输出错误信息并终止程序。不过,在C++11及之后的标准库中,std::vector
在内存分配失败时会抛出std::bad_alloc
异常,这里简单的Matrix
类使用std::vector
存储数据,所以一般情况下系统会自动处理这种异常。
- 数据类型溢出:
- 错误描述:如果矩阵元素的数据类型是有范围限制的(如
int
),在计算矩阵乘法的过程中可能会发生数据溢出,导致结果错误。
- 避免方法:根据实际情况选择合适的数据类型,例如如果元素值可能很大,可以使用
long long
或者自定义高精度数据类型。另外,可以在乘法运算前进行范围检查,以避免溢出情况发生。