特殊矩阵——对称矩阵(Symmetric Matrix)
特殊矩阵——对称矩阵(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)相关推荐
- NC17134 Symmetric Matrix
NC17134 Symmetric Matrix Problem Statement 数有多少个n×nn\times nn×n的矩阵满足下列条件: Ai,j∈{0,1,2},1≤i,j≤nA_{i,j ...
- NC17134 Symmetric Matrix(dp+数学)
链接:https://ac.nowcoder.com/acm/problem/17134 solution 首先看一下 n×nn \times nn×n 的方阵需要满足的条件: 矩阵中的任意元素 ai ...
- UVA11349 Symmetric Matrix【数学】
You're given a square matrix M. Elements of this matrix are Mij : {0 < i < n, 0 < j < n} ...
- 拉普拉斯矩阵(Laplacian matrix)及其变体详解
拉普拉斯矩阵(Laplacian matrix) 也叫做导纳矩阵.基尔霍夫矩阵或离散拉普拉斯算子,是图论中用于表示图的一种重要矩阵. 定义 给定一个具有 n n n个顶点的简单图 G = ( V , ...
- 厄米特矩阵(Hermittan Matrix)
1.厄米特矩阵(Hermittan Matrix) 1.1 共轭 1.1 共轭转置 向量的共轭转置 矩阵的共轭转置 1.2 复向量的长度 实向量的长度 xTx=[x1⋯xn][x1⋮xn]=∣x1∣2 ...
- R语言使用psych包进行探索性因子分析EFA、使用cov2cor函数将原始数据的协方差矩阵将其转换为相关性矩阵( covariance matrix into correlation matrix)
R语言使用psych包进行探索性因子分析EFA.使用cov2cor函数将原始数据的协方差矩阵将其转换为相关性矩阵( covariance matrix transform into correlati ...
- R语言使用caret包的confusionMatrix函数计算混淆矩阵、使用编写的自定义函数可视化混淆矩阵(confusion matrix)
R语言使用caret包的confusionMatrix函数计算混淆矩阵.使用编写的自定义函数可视化混淆矩阵(confusion matrix) 目录
- sklearn使用投票器VotingClassifier算法构建多模型融合的软投票器分类器(soft voting)并计算融合模型的混淆矩阵、可视化混淆矩阵(confusion matrix)
sklearn使用投票器VotingClassifier算法构建多模型融合的软投票器分类器(soft voting)并计算融合模型的混淆矩阵.可视化混淆矩阵(confusion matrix) 目录
- sklearn使用投票器VotingClassifier算法构建多模型融合的硬投票器分类器(hard voting)并计算融合模型的混淆矩阵、可视化混淆矩阵(confusion matrix)
sklearn使用投票器VotingClassifier算法构建多模型融合的硬投票器分类器(hard voting)并计算融合模型的混淆矩阵.可视化混淆矩阵(confusion matrix) 目录
最新文章
- 路由网关--spring cloud zuul
- PL0编译器TurboPascal版再现时间:2009-07-20 17:24:49来源:网络 作者:未知 点击:52次
- LiveVideoStackCon讲师热身分享 ( 十三 ) —— Intel QSV技术在FFmpeg中的实现与使用
- Web项目:解决eclipse中jsp文件报错javax.servlet.http.HttpServlet 提示 was not found on the Java Build Path的错误
- OJ1159: 最大的两个数(指针专题)(C语言)
- 小D课堂 - 新版本微服务springcloud+Docker教程_4-05 微服务调用方式之feign 实战 订单调用商品服务...
- python制作查询工具发给别人使用_Python 制作查询商品历史价格的小工具
- 听说你是程序员,请问你知道龙书、虎书、鲸书、魔法书、犀牛书...指的是哪些书么?...
- 水库大坝安全监测系统解决方案
- mall-accounts.json ES测试数据
- Arrayfire E0992 命令行错误: 宏定义无效: AF_<CPU/CUDA/OPENCL>
- java file.length 单位_Java File length()用法及代码示例
- NVIDIA CUDA 高度并行处理器编程(九):并行模式:稀疏矩阵-向量乘法
- 《基于海思35xx nnie引擎进行经典目标检测算法模型推理》视频课程介绍
- fastadmin列表自动刷新功能
- 老男孩-Python之路,Day2 - Python基础2
- 百度云“资源”被和谐,两行代码帮你解决
- 一知半解学CubeMX——IIC:OLED屏显示
- idea中设置文件头自动设置@author@date
- 零基础学Python:Matplotlib用法