❶ 怎样压缩矩阵元素的存储空间
AC
稀疏矩阵(SparseMatrix):是矩阵中的一种特殊情况,其非零元素的个数远小于零元素的个数.
压缩存储:为多个值相同的元素只分配一个存储空间;对0元素不分配空间.目的是节省大量存储空间.
当使用三元组顺序表(又称有序的双下标法)压缩存储稀疏矩阵时,对矩阵中的每个非零元素用三个域分别表示其所在的行号,列号和元素值.它的特点是,非零元在表中按行序有序存储,因此便于进行依行顺序处理的矩阵运算.当矩阵中的非0元素少于1/3时即可节省存储空间.
❷ 矩阵的压缩存储
可以看出,我们仅需声明一个长度为(1+n)n/2的一维数组array即可,剩余的都是重复的元素。
假设一维数组存储的是下三角部分,并且我们现在找的a[i][j]也是在下三角,则:
写成完整的公式,如下所示
此时我们可以声明一个长度为(1 + n) * n / 2 + 1的一维数组来存储这个三角矩阵,+1是增加一个存储常数的空间。
线代里的对角矩阵,除对角线外,其余元素都是0:
我们这里说的是非零元素都集中在对角线上下若干条对角线的对角矩阵。
n阶对角矩阵的存储有些困难,假设a条对角线是非0元,则一维数组array的大小为:
给定 i j,找对应的 k
如何压缩?我们只需要存储非0元即可,我们可以定义一个结构体:
进行压缩后的存储方式:
第一行表明原矩阵是5 * 5,并且有3个非0元
❸ 矩阵的压缩存储例子
稀疏矩阵压缩存储
一般来讲,零元素多到了一定程度并且没有规律分布的矩阵叫做稀疏矩阵。对稀疏矩阵的压缩存储必须充分考虑以下三个问题:
① 尽可能减少或者不存储零元素以节省空间,降低空间复杂度。
② 尽可能快地实现数据元素的存储位置与原有位置之间的转换。
③ 尽可能不与零元素进行运算,以降低时间复杂度。
稀疏矩阵的压缩存储有三种最常见的方法,分别是三元组顺序表、行逻辑链接顺序表和十字链表。
❹ 对称矩阵的压缩存储
#include<iostream>
using namespace std;
int main()
{
int temp[1000];
int t[500][500];
int arry1[1000],arry2[1000];
int n;
scanf("%d",&n);
int i;
int m;
m=n*n+n;
m=m/2;
for(i=1;i<=m;i++)
{
scanf("%d",&arry1[i]);
}
for(i=1;i<=m;i++)
{
scanf("%d",&arry2[i]);
}
for(i=1;i<=m;i++)
{
temp[i]=arry1[i]+arry2[i];
}
int j;
int k;
for(i=1,k=1;i<=n;i++)
{
for(j=1;j<=i;j++)
{ t[i][j]=temp[k];
k++;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(j>i)
printf("%d",t[j][i]);
else
printf("%d",t[i][j]);
if(j!=n)
printf(" ");
}
printf("\n");
}
return 0;
}
❺ 数据结构-特殊矩阵的压缩存储
本文介绍对称矩阵、三角矩阵、对角矩阵和稀疏矩阵的压缩存储方法。
在一个n阶矩阵A中,若元素满足aij=aji,0<=i,j<=n-1,则称矩阵A为对称矩阵。
按行优先顺序将这些元素存放在一个一维数组s[n(n+1)/2]中,元素aij在s中对应的下标为k:
以主对角线划分,三角矩阵分为上三角和下三角两种,上三角矩阵的下三角所有元素均为常数c,下三角矩阵正好相反。
按行优先顺序将三角矩阵存放在一维数组s[n(n+1)/2+1],其中常数c存放在数组的最后一个分量中。
上三角矩阵元素aij在s中对应的下标为k:
下三角矩阵元素aij在s中对应的下标为k:
对角矩阵是指矩阵中所有的非零元素集中在以主对角线为中心的带状区域中。一个k对角矩阵(k为奇数)A满足若|i-j|>(k-1)/2则元素aij=0。
将三对角矩阵A中的非零元素按行优先顺序存放到数组s[3n-2]中,在三对角矩阵A中,除第一行和最后一行只有两个非零元素外,其他每行中均有三个非零元素。三对角矩阵中的元素aij在s中对应的下标为 k=3×i-1+j-(i-1)=2×i+j .
设矩阵Amn中有s个非零元素,若s远远小于矩阵元素的总数,即s<<mxn,则称A为稀疏矩阵。
对于稀疏矩阵的压缩存储方法通常有两种,分别是三元组顺序表和十字链表。
1. 三元组顺序表
每个元素是一个结构体,包括该元素在矩阵中的行数、列数和数值,所有元素存在一个向量vector中,并同时记录矩阵的行数、列数及非零元素个数等信息。
2. 十字链表
为了克服顺序表中对非零元素插入和删除操作带来的不便,采用链接存储结构存储稀疏矩阵。
十字链表将每个元素存储为一个结构体,除了包括元素的行号、列号、数值外,还包括一个向右指针域用于指向同一行中的下一个非零元素和一个向下指针域用于指向同一列中的下一个非零元素。所有结构体通过两个一维指针数组分别存储各个行链表的头指针和各个列链表的头指针组织成一个整体。
目标是将每个元素的行号列号交换,并按照新的行列号按序存放。关键在于如何高效地进行按序存放。
方法一:朴素转置算法
按照原列号分别从头至尾扫描,依次放入新的矩阵中。对于一个m行n列且非零元素个数为t的稀疏矩阵而言,该算法的时间复杂度为O(t×n)。
方法二:快速转置算法
采用一个数组cnum[cols]记录每一列中的元素个数,一个数组cpot[cols]记录每一列的第一个非零元素在转置矩阵顺序表中的下标。cnum和cpot各采用一次遍历得到,其中cpot[0]=0,cpot[col]=cpot[col-1]+cnum[col-1]。
❻ 稀疏矩阵的压缩存储思想
为了节省存储空间并且加快处理速度,需要对这类矩阵进行压缩存储,压缩存储的原则是:不重复存储相同元素;不存储零值元素。稀疏矩阵,有三元组表示法、带辅助行向量的二元组表示法(也即行逻辑链表的顺序表),十字链表表示法等。算法基本思想:num[col]:第col列的非零元素个数;cpot[col]:第col列第一个非零元在b.data中的恰当位置;在转置过程中,指示该列下一个非零元在b.data中的位置。
❼ 上三角矩阵的压缩存储原则是怎样的
上三角矩阵的压缩存储原则:对于三角矩阵,从1到N的总和是这么多,也就是说整个矩阵有这么多元素。另外正三角阵对应正方形。
经常出现一些阶数很高的矩阵,同时在矩阵中非零元素呈某种规律分布或者矩阵中有大量的零元素,若仍然用常规方法存储,可能存储重复的非零元素或零元素,这将造成存储空间的大量浪费。因此对这类矩阵进行压缩存储,从而合理地利用存储空间。
简正模式:
矩阵在物理学中的另一类泛应用是描述线性耦合调和系统。这类系统的运动方程可以用矩阵的形式来表示,即用一个质量矩阵乘以一个广义速度来给出运动项,用力矩阵乘以位移向量来刻画相互作用。求系统的解的最优方法是将矩阵的特征向量求出(通过对角化等方式)。
称为系统的简正模式。这种求解方式在研究分子内部动力学模式时十分重要:系统内部由化学键结合的原子的振动可以表示成简正振动模式的叠加。描述力学振动或电路振荡时,也需要使用简正模式求解。
❽ 数据结构,矩阵压缩存储问题
这个问题出在下标的问题上吧,第一个问题,明确说明第一个非零元素a(1,1)存于B[0]中,所以推导时没问题。
第二个问题并没有说第一个非零元素a(1,1)存于B[0]中,但大多教材推导是,是将第一个非零元素a(0,0)存于B[0]中,所以公式就不一样了,你的推导逻辑没问题。