C#判断矩阵是否为对称矩阵及反称矩阵的算法实现
在C#编程中,处理二维数组时经常需要验证其数学属性。对称矩阵满足[i,j] = a[j,i],反称矩阵满足[i,j] = -a[j,i]。本文将通过具体的C#代码示例,展示如何编写健壮的检查函数,确保输入数据的有效性,并正确识别矩阵类型。
判定前提与核心逻辑
在进行属性判断前,必须确保传入的是合法的方阵。矩形矩阵(行列数不等)既不是对称也不是反称的,而空矩阵通常被视为满足条件。合法性的第一步是确认所有行的长度一致(即构成真正的矩阵),第二步确认行宽等于列高(即为方阵)。
核心循环策略是利用双重遍历:外层从第一行到最后一行,内层仅遍历当前行之前的列(j < i 或 j <= i)。这种半三角形遍历方式足以捕捉所有不对称情况,提升效率。
第1步:实现辅助函数 isMatrix
该函数用于验证二维数组是否为标准的矩形矩阵,防止因“锯齿数组”导致索引异常。
/// <summary>
/// 判断一个二维数组是否为规则矩阵
/// </summary>
private static bool isMatrix(double[][] matrix)
{
//空集合视为合法矩阵结构
if (matrix.Length < 1) return true;
//获取首行长度作为基准
int count = matrix[0].Length;
for (int i = 1; i < matrix.Length; i++)
{
//若后续行长度与首行不一致,则非矩形矩阵
if (matrix[i].Length != count)
{
return false;
}
}
return true;
}
第2步:实现对称矩阵检测 isSymmetric
对称矩阵关于主对角线镜像对称。检查逻辑为:若存在任意位置 (i, j) 使得 matrix[i][j] != matrix[j][i],则返回 false。
/// <summary>
/// 检查一个矩阵是否为对称矩阵
/// </summary>
private static bool isSymmetric(double[][] matrix)
{
if (matrix.Length == 0) return true;
//1. 合法性检查:必须是规则且为方阵
if (!isMatrix(matrix) || matrix.Length != matrix[0].Length)
{
throw new Exception("输入不合法:需为矩形方阵");
}
//2. 遍历上半三角区域进行比对
for (int i = 0; i < matrix.Length; i++)
{
for (int j = 0; j < i; j++)
{
if (matrix[i][j] != matrix[j][i])
{
return false;
}
}
}
return true;
}
第3步:实现反称矩阵检测 isSkewSymmetric
反称矩阵(斜对称矩阵)具有两个特征:
1. 主对角线元素必须全为0(即 a[i,i] = -a[i,i] => 2*a[i,i] = 0 => a[i,i] = 0);
2. 非对角线元素满足 a[i,j] = -a[j,i]。
代码中将这两者合并判断:
/// <summary>
/// 检查一个矩阵是否为反称矩阵
/// </summary>
private static bool isSkewSymmetric(double[][] matrix)
{
if (matrix.Length == 0) return true;
//1. 合法性检查
if (!isMatrix(matrix) || matrix.Length != matrix[0].Length)
{
throw new Exception("输入不合法:需为矩形方阵");
}
//2. 遍历包括对角线在内的下半三角区域
//注意:这里使用 j <= i 以同时检查对角线是否为0
for (int i = 0; i < matrix.Length; i++)
{
for (int j = 0; j <= i; j++)
{
if (matrix[i][j] != -matrix[j][i])
{
return false;
}
}
}
return true;
}
第4步:执行测试与结果验证
为了直观观察效果,以下 Main 函数构造了三类典型测试矩阵:
- matrix1:标准的对称矩阵(如距离矩阵);
- matrix2:标准的反称矩阵(反对称矩阵);
- matrix3:普通随机数字矩阵,不具备特殊性质。
static void Main(string[] args)
{
// 测试矩阵1:对称
double[][] matrix1 = new double[][]
{
new double[] { 1, 2, 3 },
new double[] { 2, 1, 2 },
new double[] { 3, 2, 1 }
};
Console.WriteLine($"Matrix1 Sym: {isSymmetric(matrix1)}, Skew: {isSkewSymmetric(matrix1)}");
// 测试矩阵2:反称
double[][] matrix2 = new double[][]
{
new double[] { 0, 1, 2 },
new double[] { -1, 0, 1 },
new double[] { -2, -1, 0 }
};
Console.WriteLine($"Matrix2 Sym: {isSymmetric(matrix2)}, Skew: {isSkewSymmetric(matrix2)}");
// 测试矩阵3:通用
double[][] matrix3 = new double[][]
{
new double[] { 1, 2, 3 },
new double[] { 4, 5, 6 },
new double[] { 7, 8, 9 }
};
Console.WriteLine($"Matrix3 Sym: {isSymmetric(matrix3)}, Skew: {isSkewSymmetric(matrix3)}");
Console.ReadLine();
}
运行上述代码后,控制台将输出各矩阵的属性判定结果,具体表现如下所示:
注意事项
- 浮点数精度:如果矩阵使用的是
float或double类型,直接比较相等性可能受精度影响。在实际工程中,建议引入一个极小值 epsilon(如1e-9)来代替!=判断,即Math.Abs(a - b) > epsilon。 - 异常处理:上述代码在未通过
isMatrix检查时抛出Exception。在应用层使用时可根据需求捕获该异常并做友好提示。
以上就是C#判断矩阵是否对称及反称的详细内容,更多关于C#二维数组处理的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









