#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& operator()(int i, int j) {
return data[i][j];
}
const int& operator()(int i, int j) const {
return data[i][j];
}
};
Matrix operator*(const Matrix& a, const Matrix& b) {
if (a.getCols() != b.getRows()) {
throw std::invalid_argument("矩阵维度不匹配");
}
Matrix result(a.getRows(), b.getCols());
for (int i = 0; i < a.getRows(); ++i) {
for (int j = 0; j < b.getCols(); ++j) {
for (int k = 0; k < a.getCols(); ++k) {
result(i, j) += a(i, k) * b(k, j);
}
}
}
return result;
}
// 讨论优先级及避免潜在错误
// 在C++中,乘法运算符优先级高于加法运算符等。
// 为避免优先级错误,在复杂表达式中使用括号明确运算顺序。
// 示例:
void priorityExample() {
Matrix a(2, 2);
Matrix b(2, 2);
Matrix c(2, 2);
a(0, 0) = 1; a(0, 1) = 2;
a(1, 0) = 3; a(1, 1) = 4;
b(0, 0) = 5; b(0, 1) = 6;
b(1, 0) = 7; b(1, 1) = 8;
c(0, 0) = 9; c(0, 1) = 10;
c(1, 0) = 11; c(1, 1) = 12;
// 明确括号,避免优先级错误
Matrix result1 = (a * b) + c;
// 如果写成 Matrix result2 = a * b + c; 则可能因优先级问题得到错误结果
}
- 矩阵乘法实现:
- 重载乘法运算符
operator*
,首先检查两个矩阵的维度是否匹配,如果不匹配抛出std::invalid_argument
异常。
- 然后创建一个新的
Matrix
对象作为结果矩阵,通过三重循环实现矩阵乘法的核心逻辑。
- 优先级讨论及代码示例:
- 在C++中,乘法运算符
*
的优先级高于加法运算符+
等。
- 在复杂表达式中,为了避免因优先级导致的潜在错误,使用括号明确运算顺序,如代码示例
priorityExample
函数中(a * b) + c
明确了先进行矩阵乘法再进行加法。