C#判断矩阵是否为对称矩阵及反称矩阵的算法实现

Jasper
Jasper
发布时间:2026-10-13| 6人浏览过
原创

在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#二维数组处理的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。