特殊矩阵——对称矩阵(Symmetric Matrix)

注:压缩存储的矩阵可以分为特殊矩阵和稀疏矩阵。对于那些具有相同元素或零元素在矩阵中分布具有一定规律的矩阵,被称之为特殊矩阵。对于那些零元素数据远远多于非零元素数目,并且非零元素的分布没有规律的矩阵称之为稀疏矩阵。

1. 对称矩阵的概念

  • 元素以主对角线为对称轴对应相等的矩阵。

2. 对称矩阵的特性

  • 对角矩阵都是对称矩阵,对称矩阵必须是方形矩阵。
  • 设一个n*n的方阵A,对于矩阵A中的任一元素aija_{ij},当且仅当aija_{ij}=ajia_{ji}时(0≤i≤n-1,0≤j≤n-1)时,矩阵A为对称矩阵。

3. 对称矩阵的压缩存储

  • 可以利用对称矩阵的上述特性,只存储对角线及对角线以下的元素,或者只存储对角线及对角线以上的元素,前者称之为下三角阵,后者称之为上三角阵。
  • 对一个n*n的对称方阵A,元素总数有n2n^2个,而上三角阵或下三角阵的元素共有n+(n-1)+(n-2)+……+2+1=n*(n+1)/2个元素。因此,存储对称方阵时最多只需存储n*(n+1)/2个元素。
  • 利用对称矩阵的对称性,可以用一维数组B存储对称矩阵A(这主要要区分四种存储方式:行优先方式存储下三角阵、行优先方式存储上三角阵、列优先方式存储下三角阵和列优先方式存储上三角阵)。
    (1)行优先方式存储下三角阵

    (2)行优先方式存储上三角阵

    (3)列优先方式存储下三角阵

    (4)列优先方式存储上三角阵

4. 特殊矩阵的实现

  • 文件:SymmetricMatrix.h

    
    #include <iostream>using namespace std;//压缩存储后,存储对称方阵时最多只需存储n*(n+1)/2个元素#define GetTotalLen(n) n * (n + 1) / 2              //按行优先方式存放下三角阵时,矩阵元素下标对应的一维数组的下标#define GetIndexRowLower(i, j) ((i + 1) * i) / 2 + j    //按行优先方式存放上三角阵时,矩阵元素下标对应的一维数组的下标
    //n * i + j - ((i + 1) * i) / 2 =>((2 * n - i - 1) * i) / 2 + j#define GetIndexRowUpper(n, i, j) ((2 * n - i - 1) * i) / 2 + j //按列优先方式存放下三角阵时,矩阵元素下标对应的一维数组的下标
    //n * j + i - ((j + 1) * j) / 2 =>((2 * n - j - 1) * j) / 2 + i #define GetIndexColLower(n, i, j) ((2 * n - j - 1) * j) / 2 + i //按列优先方式存放上三角阵时,矩阵元素下标对应的一维数组的下标#define GetIndexColUpper(i, j) ((j + 1) * j) / 2 + i    class SymmetricMatrix
    {
    public:SymmetricMatrix(int order);~SymmetricMatrix();public:void create();                          //创建矩阵void destroy();                         //销毁矩阵void transpos();                        //矩阵转置int get_order();                        //获取矩阵阶数int* compressed_storage_row_lower();    //压缩存储特殊矩阵——对称矩阵,按行优先方式存放下三角阵int* compressed_storage_row_upper();    //压缩存储特殊矩阵——对称矩阵,按行优先方式存放上三角阵int* compressed_storage_col_lower();    //压缩存储特殊矩阵——对称矩阵,按列优先方式存放下三角阵int* compressed_storage_col_upper();    //压缩存储特殊矩阵——对称矩阵,按列优先方式存放上三角阵bool is_symmetric();                    //判断矩阵是否为对称矩阵public:friend ostream& operator<<(ostream& os, SymmetricMatrix& m);    //输出矩阵private:int _order;int **_matrix;
    };
  • 文件:SymmetricMatrix.cpp

    
    #include "SymmetricMatrix.h"SymmetricMatrix::SymmetricMatrix(int order)
    : _order(order), _matrix(new int*[order])
    {create();
    }SymmetricMatrix::~SymmetricMatrix()
    {destroy();
    }void SymmetricMatrix::create()
    {for (int i = 0; i < _order; i++){_matrix[i] = new int[_order];for (int j = 0; j < _order; j++){_matrix[i][j] = i + j;}}
    }void SymmetricMatrix::destroy()
    {for (int i = 0; i < _order; i++){delete[] _matrix[i];}delete[] _matrix;_matrix = NULL;
    }void SymmetricMatrix::transpos()
    {int temp = 0;for (int i = 0; i < _order; i++){for (int j = 0; j < _order; j++){temp = _matrix[i][j];_matrix[i][j] = _matrix[j][i];_matrix[j][i] = temp;}}
    }int SymmetricMatrix::get_order()
    {return _order;
    }int* SymmetricMatrix::compressed_storage_row_lower()
    {int index = 0;int total_count = GetTotalLen(_order);int *a = new int[total_count];for (int i = 0; i < _order; i++){for (int j = 0; j <= i; j++){index = GetIndexRowLower(i, j);a[index] = _matrix[i][j];}   }return a;
    }int* SymmetricMatrix::compressed_storage_row_upper()
    {int index = 0;int total_count = GetTotalLen(_order);int *a = new int[total_count];for (int i = 0; i < _order; i++){for (int j = i; j < _order; j++){index = GetIndexRowUpper(_order, i, j);a[index] = _matrix[i][j];}   }return a;
    }int* SymmetricMatrix::compressed_storage_col_lower()
    {int index = 0;int total_count = GetTotalLen(_order);int *a = new int[total_count];for (int j = 0; j < _order; j++){for (int i = j; i < _order; i++){index = GetIndexColLower(_order, i, j);a[index] = _matrix[i][j];}}return a;
    }int* SymmetricMatrix::compressed_storage_col_upper()
    {int index = 0;int total_count = GetTotalLen(_order);int *a = new int[total_count];for (int j = 0; j < _order; j++){for (int i = 0; i <= j; i++){index = GetIndexColUpper(i, j);a[index] = _matrix[i][j];}}return a;
    }bool SymmetricMatrix::is_symmetric()
    {for (int i = 0; i < _order; i++){for (int j = 0; j < _order; j++){if (_matrix[i][j] != _matrix[j][i]){return false;}}}return true;
    }ostream& operator<<(ostream& os, SymmetricMatrix& m)
    {for (int i = 0; i < m._order; i++){for (int j = 0; j < m._order; j++){os << m._matrix[i][j] << " ";}os << endl;}return os;
    }
  • 文件:main.cpp

    
    #include "SymmetricMatrix.h"int main()
    {int n = 0;cout << "请输入对称矩阵的阶数,n = ";cin >> n;SymmetricMatrix matrix(n);if (true == matrix.is_symmetric()){cout << "$ 输出对称矩阵:" << endl;cout << matrix;//或operator<<(cout, matrix);}matrix.transpos();if (true == matrix.is_symmetric()){cout << "$ 输出转置后的对称矩阵:" << endl;cout << matrix;//或operator<<(cout, matrix);}cout << "\n$ 输出压缩存储后的一维数组(按行优先方式存放下三角阵):" << endl;int *arrayrl = matrix.compressed_storage_row_lower();for (int i = 0; i < GetTotalLen(matrix.get_order()); i++){cout << arrayrl[i] << " ";}cout << endl;delete[] arrayrl;cout << "\n$ 输出压缩存储后的一维数组(按行优先方式存放上三角阵):" << endl;int *arrayru = matrix.compressed_storage_row_upper();for (int i = 0; i < GetTotalLen(matrix.get_order()); i++){cout << arrayru[i] << " ";}cout << endl;delete[] arrayru;cout << "\n$ 输出压缩存储后的一维数组(按列优先方式存放下三角阵):" << endl;int *arraycl = matrix.compressed_storage_col_lower();for (int i = 0; i < GetTotalLen(matrix.get_order()); i++){cout << arraycl[i] << " ";}cout << endl;delete[] arraycl;cout << "\n$ 输出压缩存储后的一维数组(按列优先方式存放上三角阵):" << endl;int *arraycu = matrix.compressed_storage_col_upper();for (int i = 0; i < GetTotalLen(matrix.get_order()); i++){cout << arraycu[i] << " ";}cout << endl;delete[] arraycu;system("pause");return 0;
    }

参考文献:
[1]《数据结构(用面向对象方法与C++语言描述)(第2版)》殷人昆——第四章
[2] 百度搜索关键字:对称矩阵

特殊矩阵——对称矩阵(Symmetric Matrix)相关推荐

  1. NC17134 Symmetric Matrix

    NC17134 Symmetric Matrix Problem Statement 数有多少个n×nn\times nn×n的矩阵满足下列条件: Ai,j∈{0,1,2},1≤i,j≤nA_{i,j ...

  2. NC17134 Symmetric Matrix(dp+数学)

    链接:https://ac.nowcoder.com/acm/problem/17134 solution 首先看一下 n×nn \times nn×n 的方阵需要满足的条件: 矩阵中的任意元素 ai ...

  3. UVA11349 Symmetric Matrix【数学】

    You're given a square matrix M. Elements of this matrix are Mij : {0 < i < n, 0 < j < n} ...

  4. 拉普拉斯矩阵(Laplacian matrix)及其变体详解

    拉普拉斯矩阵(Laplacian matrix) 也叫做导纳矩阵.基尔霍夫矩阵或离散拉普拉斯算子,是图论中用于表示图的一种重要矩阵. 定义 给定一个具有 n n n个顶点的简单图 G = ( V , ...

  5. 厄米特矩阵(Hermittan Matrix)

    1.厄米特矩阵(Hermittan Matrix) 1.1 共轭 1.1 共轭转置 向量的共轭转置 矩阵的共轭转置 1.2 复向量的长度 实向量的长度 xTx=[x1⋯xn][x1⋮xn]=∣x1∣2 ...

  6. R语言使用psych包进行探索性因子分析EFA、使用cov2cor函数将原始数据的协方差矩阵将其转换为相关性矩阵( covariance matrix into correlation matrix)

    R语言使用psych包进行探索性因子分析EFA.使用cov2cor函数将原始数据的协方差矩阵将其转换为相关性矩阵( covariance matrix transform into correlati ...

  7. R语言使用caret包的confusionMatrix函数计算混淆矩阵、使用编写的自定义函数可视化混淆矩阵(confusion matrix)

    R语言使用caret包的confusionMatrix函数计算混淆矩阵.使用编写的自定义函数可视化混淆矩阵(confusion matrix) 目录

  8. sklearn使用投票器VotingClassifier算法构建多模型融合的软投票器分类器(soft voting)并计算融合模型的混淆矩阵、可视化混淆矩阵(confusion matrix)

    sklearn使用投票器VotingClassifier算法构建多模型融合的软投票器分类器(soft voting)并计算融合模型的混淆矩阵.可视化混淆矩阵(confusion matrix) 目录

  9. sklearn使用投票器VotingClassifier算法构建多模型融合的硬投票器分类器(hard voting)并计算融合模型的混淆矩阵、可视化混淆矩阵(confusion matrix)

    sklearn使用投票器VotingClassifier算法构建多模型融合的硬投票器分类器(hard voting)并计算融合模型的混淆矩阵.可视化混淆矩阵(confusion matrix) 目录

最新文章

  1. 路由网关--spring cloud zuul
  2. PL0编译器TurboPascal版再现时间:2009-07-20 17:24:49来源:网络 作者:未知 点击:52次
  3. LiveVideoStackCon讲师热身分享 ( 十三 ) —— Intel QSV技术在FFmpeg中的实现与使用
  4. Web项目:解决eclipse中jsp文件报错javax.servlet.http.HttpServlet 提示 was not found on the Java Build Path的错误
  5. OJ1159: 最大的两个数(指针专题)(C语言)
  6. 小D课堂 - 新版本微服务springcloud+Docker教程_4-05 微服务调用方式之feign 实战 订单调用商品服务...
  7. python制作查询工具发给别人使用_Python 制作查询商品历史价格的小工具
  8. 听说你是程序员,请问你知道龙书、虎书、鲸书、魔法书、犀牛书...指的是哪些书么?...
  9. 水库大坝安全监测系统解决方案
  10. mall-accounts.json ES测试数据
  11. Arrayfire E0992 命令行错误: 宏定义无效: AF_<CPU/CUDA/OPENCL>
  12. java file.length 单位_Java File length()用法及代码示例
  13. NVIDIA CUDA 高度并行处理器编程(九):并行模式:稀疏矩阵-向量乘法
  14. 《基于海思35xx nnie引擎进行经典目标检测算法模型推理》视频课程介绍
  15. fastadmin列表自动刷新功能
  16. 老男孩-Python之路,Day2 - Python基础2
  17. 百度云“资源”被和谐,两行代码帮你解决
  18. 一知半解学CubeMX——IIC:OLED屏显示
  19. idea中设置文件头自动设置@author@date
  20. 零基础学Python:Matplotlib用法

热门文章

  1. java百度地图逆地址解析_web前端通过百度地图API批量逆解析地址
  2. tlc2543 多通道选择 错误
  3. Android介绍(未整理完...)
  4. 股市的起源发展和意义
  5. SQLite 命令行客户端 sqlite3 使用指南
  6. 百度搜索稳定性问题分析的故事(上)
  7. 远程计算机一键休眠,nuc8i5远程登录-windows10频繁自动休眠解决方案
  8. 宏基因组分析-基于组装
  9. 什么是HIS,以及HIS的作用,特点,组成部分
  10. 学计算机的心理300字,心理作文300字3篇