public struct Matrix
{
private int[,] data;
public Matrix(int rows, int cols)
{
data = new int[rows, cols];
}
// 运算符重载:矩阵加法
public static Matrix operator +(Matrix a, Matrix b)
{
if (a.data.GetLength(0) != b.data.GetLength(0) || a.data.GetLength(1) != b.data.GetLength(1))
{
throw new ArgumentException("矩阵维度不匹配");
}
Matrix result = new Matrix(a.data.GetLength(0), a.data.GetLength(1));
for (int i = 0; i < a.data.GetLength(0); i++)
{
for (int j = 0; j < a.data.GetLength(1); j++)
{
checked
{
result.data[i, j] = a.data[i, j] + b.data[i, j];
}
}
}
return result;
}
// 运算符重载:矩阵乘法
public static Matrix operator *(Matrix a, Matrix b)
{
if (a.data.GetLength(1) != b.data.GetLength(0))
{
throw new ArgumentException("矩阵维度不匹配");
}
Matrix result = new Matrix(a.data.GetLength(0), b.data.GetLength(1));
for (int i = 0; i < a.data.GetLength(0); i++)
{
for (int j = 0; j < b.data.GetLength(1); j++)
{
int sum = 0;
for (int k = 0; k < a.data.GetLength(1); k++)
{
checked
{
sum += a.data[i, k] * b.data[k, j];
}
}
result.data[i, j] = sum;
}
}
return result;
}
// 获取矩阵元素
public int this[int row, int col]
{
get { return data[row, col]; }
set { data[row, col] = value; }
}
}
确保运算正确性
- 维度检查:在进行加法和乘法运算前,先检查矩阵的维度是否匹配。加法要求两个矩阵的行数和列数都相同,乘法要求第一个矩阵的列数等于第二个矩阵的行数。如果维度不匹配,抛出
ArgumentException
异常,以确保运算在正确的维度下进行。
- 使用
checked
关键字:在进行加法和乘法运算时,使用checked
关键字来检测整数溢出。当启用checked
时,如果发生溢出,会抛出OverflowException
异常,这有助于及时发现运算中的错误。
确保运算效率
- 避免不必要的循环:在矩阵乘法中,直接使用三层循环遍历矩阵元素进行乘法和累加,没有使用额外的中间数据结构或复杂的算法,保持了简洁高效的实现。
- 局部变量优化:在矩阵乘法中,使用局部变量
sum
来累加结果,减少对矩阵元素的重复访问,提高了效率。
处理溢出问题
- 使用
checked
关键字:如上述代码所示,在加法和乘法运算中使用checked
关键字,当发生整数溢出时,会抛出OverflowException
异常。在实际应用中,可以在调用代码处捕获这个异常,并根据具体需求进行处理,例如记录日志、提示用户或进行特殊的错误恢复操作。
- 数据类型选择:如果矩阵元素的数值范围较大,可能会频繁发生溢出,可以考虑使用更大的数据类型,如
long
或decimal
,以减少溢出的可能性。但要注意不同数据类型在性能和内存占用上的差异。