一、存储矩阵用一个二维数组即可;
二、什么是对称矩阵:
设一个N*N的方阵A,A中任意元素Aij,当且仅当 Aij == Aji(0 <= i <= N-1&& 0 <= j <= N-1),则矩阵A是对称矩阵。以矩阵的对角线为分隔,分为上三角和下三角
三、对称矩阵的压缩储存:
压缩存储称矩阵存储时只需要存储上三角/下三角的数据,所以最多存储n(n+1)/2个数据(相当于1+2+…+n,即等差数列求和)。
对称矩阵和压缩存储的对应关系:下三角存储i>=j, SymmetricMatrix[i][j] ==Array[i*(i+1)/2+j]
四、代码实现
#include<iostream> using namespace std; template<class T> class CompressionMatrix { public: CompressionMatrix(T* arr,int sz) :_data(new T[sz*(sz+1)/2]) ,_size(sz) { int index=0; //压缩储存过程 for(int i=0;i<sz;++i) { for(int j=0;j<sz;++j) { if (i>=j)//_data中储存下三角的数据 { _data[index]=arr[i*sz+j]; index++; } else break; } } } //获取某个坐标的数据,i和j代表该数据在矩阵中的横纵坐标 T GetDate(int i,int j) { if (i>=j)//下三角数据 { return _data[i*(i+1)/2+j]; } else//上三角数据 { std::swap(i,j);//将横坐标和从坐标值交换; return _data[i*(i+1)/2+j]; } } //打印矩阵的数据 void PrintfMatrix() { for (int i=0;i<_size;++i) { for (int j=0;j<_size;++j) { cout<<GetDate(i,j)<<" "; } cout<<endl; } } ~CompressionMatrix() { if (_data!=NULL) { delete[] _data; _data=NULL; _size=0; } } protected: T* _data;//储存数据的数组 int _size;//储存原始对称矩阵的行数(或列数) };
测试代码:
int main() { int a[5][5]= { {0,1,2,3,4}, {1,0,1,2,3}, {2,1,0,1,2}, {3,2,1,0,1}, {4,3,2,1,0}, }; CompressionMatrix<int> cm((int*)a,5);//将二维数组强制转换为一维数组指针,是问题更简单 cm.PrintfMatrix(); return 0; }
五、运行结果
O(∩_∩)O
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对小牛知识库的支持。如果你想了解更多相关内容请查看下面相关链接
主要内容:对称矩阵,上(下)三角矩阵,稀疏矩阵,矩阵压缩存储的 3 种方式数据结构中,提供针对某些特殊矩阵的压缩存储结构。 这里所说的特殊矩阵,主要分为以下两类: 含有大量相同数据元素的矩阵,比如对称矩阵; 含有大量 0 元素的矩阵,比如稀疏矩阵、上(下)三角矩阵; 针对以上两类矩阵,数据结构的压缩存储思想是:矩阵中的相同数据元素(包括元素 0)只存储一个。 对称矩阵 图 1 对称矩阵示意图 图 1 的矩阵中,数据元素沿主对角线对应相等,这类矩阵称为 对称矩阵。 矩阵中
本文向大家介绍C++ 数据结构之对称矩阵及稀疏矩阵的压缩存储,包括了C++ 数据结构之对称矩阵及稀疏矩阵的压缩存储的使用技巧和注意事项,需要的朋友参考一下 对称矩阵及稀疏矩阵的压缩存储 1.稀疏矩阵 对于那些零元素数目远远多于非零元素数目,并且非零元素的分布没有规律的矩阵称为稀疏矩阵(sparse)。 人们无法给出稀疏矩阵的确切定义,一般都只是凭个人的直觉来理解这个概念,即矩阵中非零元素的个
本文向大家介绍C++ 实现稀疏矩阵的压缩存储的实例,包括了C++ 实现稀疏矩阵的压缩存储的实例的使用技巧和注意事项,需要的朋友参考一下 C++ 实现稀疏矩阵的压缩存储的实例 稀疏矩阵:M*N的矩阵,矩阵中有效值的个数远小于无效值的个数,且这些数据的分布没有规律。 稀疏矩阵的压缩存储:压缩存储值存储极少数的有效数据。使用{row,col,value}三元组存储每一个有效数据,三元组按原矩阵中的位置
特殊矩阵——对称矩阵(Symmetric Matrix) 注:压缩存储的矩阵可以分为特殊矩阵和稀疏矩阵。对于那些具有相同元素或零元素在矩阵中分布具有一定规律的矩阵,被称之为特殊矩阵。对于那些零元素数据远远多于非零元素数目,并且非零元素的分布没有规律的矩阵称之为稀疏矩阵。 1. 对称矩阵的概念 元素以主对角线为对称轴对应相等的矩阵。 2. 对称矩阵的特性 对角矩阵都是对称矩阵,对称矩阵必须是方形矩阵
我试图乘以两个块对称矩阵(矩阵大小矩阵大小)。我想执行块矩阵乘法(将一个矩阵分成多个块大小矩阵,并将相应的块相乘)。我已经写了一些代码,但想改进它,并存储主对角线以上的块,但我没有任何想法。如果可能的话,你们能帮忙吗?
我正在尝试创建一个随机生成的2D symetrix矩阵,其大小为n。随机数也必须介于0和100之间。 这是我到目前为止得到的; 这成功地生成了一个带有随机数的2D数组,但是矩阵不是对称的,我不知道如何使它成为对称的。