-
c语言对称矩阵的压缩存储_【数据结构】对称矩阵及对称矩阵的压缩存储
2021-02-27 10:53:30对称矩阵:设一个N*N的方阵A,A中任意元素Aij,当且仅当Aij == Aji(0 <...如下面矩阵:对称矩阵压缩存储时只需要存储i*(i+1)/2个数据。对称矩阵与压缩矩阵的关系是:对称矩阵SymmetricMatrix[i][j] =压缩...对称矩阵:
设一个N*N的方阵A,A中任意元素Aij,当且仅当Aij == Aji(0 <= i <= N-1 && 0 <= j <= N-1),则矩阵A是对称矩阵。以矩阵的对角线为分隔,分为上三角和下三角。
如下面矩阵:
对称矩阵压缩存储时只需要存储i*(i+1)/2个数据。
对称矩阵与压缩矩阵的关系是:
对称矩阵SymmetricMatrix[i][j] =压缩矩阵Array(i*(i+1)/2+j)。
下面我实现一下对称矩阵存储在压缩矩阵以及将压缩矩阵中的元素还原成对称矩阵打印出来的代码。
代码如下:#include
using namespace std;
template
class SymmtrixMatrix
{
public:
SymmtrixMatrix(T* a, size_t size)
:_a(new T[size*(size+1)/2])
, _size(size*(size + 1) / 2)
{
for (int i = 0; i
{
for (int j = 0; j
{
if (i >= j)
{
//将对称矩阵转换为压缩矩阵
_a[i*(i + 1) / 2+j] = a[i*size+j];
}
}
}
}
//压缩矩阵的访问打印
void Print(size_t size)
{
for (int i = 0; i
{
for (int j = 0; j
{
int row = i;
int col = j;
if (row
{
swap(row, col);
}
cout <
}
cout <
}
cout <
}
private:
T* _a;
size_t _size; //即n,对称矩阵为方阵
};
void Test()
{
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 },
};
SymmtrixMatrix sm((int*)a, 5);
sm.Print(5);
}
int main()
{
Test();
system("pause");
return 0;
}
-
判断上三角矩阵_C语言:数据结构-对称矩阵的压缩存储
2020-12-06 13:04:57对称矩阵(1)特点矩阵中行数等于列数,即它是一个方阵,且第i行第j列的元素与第j行第i列的...对称矩阵(2)对称矩阵的压缩存储原理根据对称矩阵的特点(ai,j=aj,i),行数=列数,所以只要存储下三角部分的矩阵元素,其...对称矩阵
(1)特点
矩阵中行数等于列数,即它是一个方阵,且第i行第j列的元素与第j行第i列的元素对应相等,即ai,j=aj,i。
例5.5 图5-5是一个4阶对称的对称矩阵,虚线所示部分称为对称矩阵的下三角部分(包括对角线部分),显然对下三角部分数组元素ai,j,一定有i≥j。
对称矩阵
(2)对称矩阵的压缩存储原理
根据对称矩阵的特点(ai,j=aj,i),行数=列数,所以只要存储下三角部分的矩阵元素,其他矩阵元素可根据对称矩阵的特性得到。
(3)存储方法
定义一个一维数组,其数据类型与对称矩阵的相同,长度大于等于对称矩阵的下三角部分的元素个数。确定在一维数组中存储的起始点,以行序为主,依次存储下三角部分的矩阵元素到一维数组中。
例5.6 对称矩阵的压缩存储
用对称矩阵的压缩存储方法,把上图5-5所示的矩阵A存储到一维数组b中。一维数组存储的起始下标为零,如图5-6所示。
对称矩阵的压缩存储
例5.7 在例5.6中,求矩阵元素a4,2对应一维数组b中的数组元素。设矩阵在存放时,从一维数组的第一个元素b[0]开始。
分析:矩阵元素a4,2在第4行第2列,而下三角部分的前3行的元素个数为:1+2+3=6,第4行从第1列到第2列有两个元素。共有6+2=8个元素。
由此,a4,2是下三角部分的第8号元素。存放时从元素b[0]开始,所以矩阵元素a4,2 对应一维数组中的数组元素为b[7]。
(4)对称矩阵压缩存储的关系式
设有对称矩阵A,一维数组b,把矩阵A的下三角部分压缩存储到一维数组b中。矩阵元素aij,(i≥j),对应于b[k],则有:
k= a[i(i-1)/2+j-1] 从b[0]开始存储
k= a[i(i-1)/2+j] 从b[1]开始存储
注:当i≤j时,因为ai,j=aj,i,只要按照aj,i计算即可。
-
对称矩阵及对称矩阵的压缩存储
2016-10-20 16:48:571.对称矩阵:设一个N*N的方阵A,A中任意元素Aij,当且仅当Aij == Aji(0 ...3.对称矩阵和压缩存储的对应关系:下三角存储i>=j, SymmetricMatrix[i][j] == Array[i*(i+1)/2+j]。 4.这就是一个对称矩阵1.对称矩阵:设一个N*N的方阵A,A中任意元素Aij,当且仅当Aij == Aji(0 <= i <= N-1 && 0 <= j <= N-1),则矩阵A是对称矩阵。以矩阵的对角线为分隔,分为上三角和下三角。
2.压缩存储称矩阵存储时只需要存储上三角/下三角的数据,所以最多存储n(n+1)/2个数据
(根据等差数列的前n项和可求得)。
3.对称矩阵和压缩存储的对应关系:下三角存储i>=j, SymmetricMatrix[i][j] == Array[i*(i+1)/2+j]。
4.这就是一个对称矩阵。
template<class T> class SymmetricMatrix { public: SymmetricMatrix(T* a,size_t n) //i>=j :_n(n) { _a=new T[n*(n+1)/2]; size_t k=0; for(size_t i=0;i<n;i++) { for(size_t j=0;j<n;j++) { if(i>=j) { _a[k++]=a[i*_n+j]; } } } } ~SymmetricMatrix() { if(_a!=NULL) { delete[] _a; _n=0; } } T& Access(size_t i,size_t j) { if(i<j) { swap(i,j); } return _a[i*(i+1)/2+j]; } void Display() { for(size_t i=0;i<_n;i++) { for(size_t j=0;j<_n;j++) { cout<<Access(i,j)<<" "; } cout<<endl; } } private: T* _a; //数组 size_t _n; //行和列数 }; void TestSymmetricMatrix() { 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}, }; SymmetricMatrix<int> sm((int*)a,5); //cout<<sm.Access (4,0)<<endl; sm.Display(); }
-
对称矩阵的压缩存储
2021-01-27 23:36:37对称矩阵 主要分享对特殊矩阵中对称矩阵的压缩存储,如果其中有一些错误请多多包涵。...同时对称三角形对称矩阵以对角线为分界线可分为上三角和下三角 2>压缩存储的必要性 矩阵和数组的联系: 线性..对称矩阵
主要分享对特殊矩阵中对称矩阵的压缩存储,如果其中有一些错误请多多包涵。
1>什么是对称矩阵
对称矩阵是一种特殊的矩阵:其数据沿着对角线对称(沿着对角线一一对称)
这里涉及到线性代数其中的一个概念,如果一个矩阵的转置矩阵对于自身则该矩阵为对称矩阵
同时对称三角形对称矩阵以对角线为分界线可分为上三角和下三角
2>压缩存储的必要性
矩阵和数组的联系:
线性代数上的矩阵等价于数据结构中的数组,例如A=[1,2,3,4,5,6]这是一个1x6的矩阵同时也是一个一维数组。同理就会有二维数组三维数组一直到n维数组分别对于矩阵
对称矩阵的必定满足行=列,要不然无法满足对称条件
存储方式
在计算机中对于一阶矩阵我们就会开辟一个一维数组去存储(相对简单便利),但是随着阶数的增加如果我们再去开辟同样维数的地址空间那么系统存储的代价就会很大。所以我们要进行压缩矩阵去存储(这里的压缩并不是丢失数据)
所以综上我们可以得到要尽可能的去减少内存的占有同时尽可能的提高内存的利用率,则对于这种特殊矩阵是可以进行处理达到以最少的内存去存储(以对角线为分界线存储一半的数据就可以存储整个矩阵的数据在根据对称可以存储每个位置的数据)
3>分析步骤
数组占用地址=数据数目*数据类型大小 (可以通过sizeof函数得到数据类型的大小)
对称矩阵有两种排列方式: 1 按照行序进行排列(一行存满在转到下一行) 2 按照列进行排列(一列存满在转到下一列)
按照行进行排列(假设有矩阵Dnxn,其中下标从1开始)//矩阵中下标多从1开始,数组中以0开始
先不考虑数据对应问题,我们假设现将xia三角数据全部放到一维数组中。所以需要考虑三个因素:数组的长度、如何定位数据(比如Aij)、如何将下三角元素表达
数组长度:
需要计数上三角中所有数据的个数,
第一行a11(1个数据)
第二行a21-->a22 (2个数据)
.....
第n行an1--->ann(n个数据)
综上课只下三角共有数据数量:1+2+3.....+n=[n(n+1)/2]-1=maxsize,这就是我们开辟一维数组数据的总长度也就是data[maxsize]
同理就可以计算任意点的位置
定位数据(比如Aij)
第一行a11(1个数据)
第二行a21-->a22 (2个数据)
.....
第i-1行a(i-1)1--->a(i-1)n(i-1个数据)
位置:1+2+3.....+i-1+j=[i(i-1)/2]+j-1
所以就完成了对数组maxsize和对任意位置的定位
下三角元素表达
这个可以根据对称原理:Aij=Aji,即可完成对下三角数据的表达和保存
同理如果是按列进行存储只需要将公式中的i换成j即可
4>代码实现
这里实现是按行存储在下三角型的情况
定义一个4阶的矩阵
int array[4][4] = { {1,2,3,4}, {2,9,4,5}, {3,4,0,6}, {4,5,6,3}, }; printf("对称矩阵如下\n"); for (int i = 1; i <=4; i++) { for (int j = 1; j <=4; j++) { printf("a[%d][%d]=%d ", i, j, array[i-1][j-1]); if (j == 4) printf("\n"); } }
赋值并且输出一维数组:
for (int k = 0; k < maxsize ; k++) { for (int i = 1; i <=4; i++) { for (int j = 1; j <=4; j++) { if (i*(i - 1) / 2 + j - 1 == k) { array1[k] = array[i - 1][j - 1]; } } } } printf("一维数组:"); for (int i = 0; i < maxsize; i++) { printf("%d ",array1[i]); }
-
数据结构::矩阵(一)--对称矩阵及对称矩阵的压缩存储
2016-12-12 18:38:12【对称矩阵】: 1、定义:元素以对角线为对称轴对应相等的矩阵。 设一个N*N的方阵A,A中任意元素Aij,当且仅当Aij == Aji(0 ...2、对称矩阵和压缩存储的对应关系:下三角存储i>=j, SymmetricM -
【数据结构】对称矩阵及对称矩阵的压缩存储
2016-04-13 09:21:33对称矩阵:设一个N*N的方阵A,A中任意元素Aij,当且仅当Aij == Aji(0 <= i <...如下面矩阵:对称矩阵压缩存储时只需要存储i*(i+1)/2个数据。对称矩阵与压缩矩阵的关系是:对称矩阵SymmetricMatri... -
34-对称矩阵的压缩存储
2018-06-26 20:11:26对于矩阵这样由n行n列构成的数据...(3)上三角矩阵/下三角矩阵 1. 对称矩阵的压缩存储 若一个n阶方阵A[n][n]中的元素满足aij=aji(0≤i,j≤n-1),则称其为n阶对称矩阵。 对称矩阵的压缩存储的策略: 存储... -
c++对称矩阵的压缩存储
2016-05-26 19:10:17对称矩阵对称矩阵及对称矩阵的压缩存储 设一个N*N的方阵A,A中任意元素Aij,当且仅当Aij == Aji(0 <...压缩存储称矩阵存储时只需要存储上三角/下三角的数据,所以最多存 储n(n+1)/2个数据。 对称矩阵... -
实现对称矩阵以及压缩存储
2017-04-20 17:18:27压缩矩阵:对称矩阵存储时只需要存储上三角或下三角的数据,所以最多存储 n*(n+1)/2个数据。 在存数据的 时候我们只需要将一半的数据存入一个一维数组中: 当然包含对角线元素 如果我们想要通过保存的这个一维... -
对称矩阵、稀疏矩阵的压缩存储
2016-04-15 17:02:24对称矩阵、稀疏矩阵的压缩存储1)对称矩阵的压缩存储 对称矩阵顾名思义就是符合行和列的个数相同,并且矩阵中存储的数据上三角和下三角中对应位置上的元素值是相等的。为了能够减少存储的空间,我们可以只存储上三角... -
对称矩阵 压缩存储
2016-04-18 21:00:43对称矩阵及对称矩阵的压缩存储设一个N*N的方阵A,A中任意元素Aij,当且仅当Aij == Aji(0 <= i <= N-1 &&0 <= j <= N-1),则矩阵A是对称矩阵。以矩阵的对角线为分隔,分为上三角和下三角。压缩... -
矩阵-----对称矩阵及其压缩存储&&稀疏矩阵
2016-06-06 10:29:10什么是对称矩阵(SymmetricMatrix)?对称对称-------看设一个N*N的方阵A,A中任意元素Aij,当且仅当Aij =...对称矩阵和压缩存储的对应关系:下三角存储i>=j, SymmetricMatrix[i][j] == Array[i*(i+1)/2+j]650) this.w -
对称矩阵的缩放存储
2016-04-18 18:57:30:对称矩阵缩放,目的就是为了节省空间,当矩阵很大时,节省的空间就很可观, 编写该程序的最主要问题在于:考虑清楚,当将下三角创建好之后,如何让上三角的元素关于对角线对称?这就利用到公式:**对称矩阵里的中...