当前位置:首页 » 服务存储 » 稀疏变量存储
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

稀疏变量存储

发布时间: 2023-03-29 00:03:15

‘壹’ 稀疏矩阵的存储空间

一个稀疏矩阵中有许多元素等于零,这便于矩阵的计算和保存.如果Matlab把一个矩阵当作稀疏矩阵,那么只需在m×3的矩阵中存储m个非零项.第1列是行下标,第2列是列下标,第3列是非零元素值,不必保存零元素.如果存储一个浮点数要8个字节,存储每个下标要4个字节,那么整个矩阵在内存中存储需要1 6×m个字节.
A = e y e ( 1 0 0 0 ) ;
得到一个1 0 0 0×1 0 0 0的单位矩阵,存储它需要8 MB空间.如果使用命令:
B = s p e y e ( 1 0 0 0 ) ;
用一个1 0 0 0×3的矩阵来代表,每行包含有一个行下标,列下标和元素本身.只需1 6 K B的空间就可以存储1 0 0 0×1 0 0 0的单位矩阵,它只需要满单位矩阵的0 . 2 %存储空间.对于许多的广义矩阵也可这样来作.

‘贰’ 对稀疏矩阵进行压缩存储的目的是什么

对稀疏矩阵进行压缩存储目的是节省存储空间。

存储矩阵的一般方法是采用二维数组,其优点是可以随机地访问每一个元素,因而能够较容易地实现矩阵的各种运算。

但对于稀疏矩阵而言,若用二维数组来表示,会重复存储了很多个0了,浪费空间,而且要花费时间来进行零元素的无效计算。所以必须考虑对稀疏矩阵进行压缩存储。



(2)稀疏变量存储扩展阅读

优点

稀疏矩阵的计算速度更快,因为MATLAB只对非零元素进行操作,这是稀疏矩阵的一个突出的优点。假设矩阵A,B中的矩阵一样,计算2*A需要一百万次的浮点运算,而计算2*B只需要2000次浮点运算。

因为MATLAB不能自动创建稀疏矩阵,所以要用特殊的命令来得到稀疏矩阵。算术和逻辑运算都适用于稀疏矩阵。对于一个用二维数组存储的稀疏矩阵Amn,如果假设存储每个数组元素需要L个字节,那么存储整个矩阵需要m*n*L个字节。

‘叁’ 如何建立一个稀疏矩阵并存储

//创建稀疏矩阵M
Status CreateSMatrix(TSMatrix * M)
{
int i,m,n;
ElemType e;
Status k;
printf("请输入矩阵的行数,列数,非零元素数:");
scanf("%d,%d,%d",&(* M).mu,&(* M).nu,&(* M).tu);
if ((* M).tu > MAX_SIZE)
{
return ERROR;
}
(* M).data[0].i = 0;
for (i=1;i<=(* M).tu; ++i)
{
do
{
printf("请按行序顺序输入第%d个非零元素所在的行(1-%d),列(1-%d),元素值:",i,(* M).mu,(* M).nu);
scanf("%d,%d,%d",&m,&n,&e);
k = 0;
if (m<1 || m>(* M).mu || n<1 || n>(* M).nu)//行或列超出范围
{
k = 1;
}
if (m<(* M).data[i-1].i || m==(* M).data[i-1].i && n<=(* M).data[i-1].j)//行或列的顺序有错
{
k = 1;
}
}while (k);
(* M).data[i].i = m;
(* M).data[i].j = n;
(* M).data[i].e = e;
}
return OK;
}

‘肆’ 对稀疏矩阵进行压缩存储目的是() A.便于进行矩阵运算 B.便于输入和输出 C.节省存储空间 D.降低运

对稀疏矩阵进行压缩存储目的是节省存储空间。

稀疏矩阵的存储方式:

存储矩阵的一般方法是采用二维数组,其优点是可以随机地访问每一个元素,因而能够较容易地实现矩阵的各种带岁运算。但对于稀疏矩阵而言,若用二维数组来表示,会重复存储了很多个0了,浪费空间,而且要花费时间来进行零元素的无效计算。所以必须考虑对稀疏矩阵进行压缩悉行笑存储。

(4)稀疏变量存储扩展阅读:

最常用的稀疏矩阵睁含存储格式主要有:三元组(i,j,a(i,j))和CSR(Compressed Sparse Row)。

(1) 三元组(i,j,a(i,j))(也叫COO(Coordinate Format))

三元组(i,j,a(i,j))很简单,就是使用3个数组,分别存储全部非零元的行下标(row index)、列下标(column index)和值(value)

(2) CSR存储(Compressed Sparse Row,压缩稀疏的行)

CSR是比较标准的一种,也需要三类数据来表达:数值,列号,以及行偏移。数值和列号与COO一致,表示一个元素以及其列号,行偏移表示某一行的第一个元素在values里面的起始偏移位置。

‘伍’ 稀疏矩阵的压缩存储思想

为了节省存储空间并且加快处理速度,需要对这类矩阵进行压缩存储,压缩存储的原则是:不重复存储相同元素;不存储零值元素。稀疏矩阵,有三元组表示法、带辅助行向量的二元组表示法(也即行逻辑链表的顺序表),十字链表表示法等。算法基本思想:num[col]:第col列的非零元素个数;cpot[col]:第col列第一个非零元在b.data中的恰当位置;在转置过程中,指示该列下一个非零元在b.data中的位置。

‘陆’ 数据结构 稀疏矩阵一般的压缩存储方法有哪几种

来自 严蔚敏《数据结构》
稀疏矩阵的压缩方法主要有:
1:三元组顺序表 (行下标,列下标,值)
2:行逻辑链接的顺序表。
3:十字链表。

‘柒’ 稀疏矩阵一般的压缩存储方法有两种

分别是三元组和十字链表。

三元组是指形如((x,y),z)的集合(这就是说,三元组是这样的偶,其第一个射影亦是一个偶),常简记为(x,y,z)。

三元组是计算机专业的一门公共基础课程——数据结构里的概念。主要是用来存储稀疏矩阵的一种压缩方式,也叫三元组表。假设以顺序存储结构来表示三元组表(triple table),则得到稀疏矩阵的一种压缩存储方式,即三元组顺序表,简称三元组表。

十字链表(Orthogonal List)是有向图的另一种链式存储结构。该结构可以看成是将有向图的邻接表和逆邻接表结合起来得到的。用十字链表来存储有向图,可以达到高效的存取效果。同时,代码的可读性也会得到提升。

拓展资料:

十字链表(Orthogonal List)是有向图的另一种链式存储结构。可以看成是将有向图的邻接表和逆邻接表结合起来得到的一种链表。在十字链表中,对应于有向图中每一条弧都有一个结点,对应于每个定顶点也有一个结点。

十字链表之于有向图,类似于邻接表之于无向图。

也可以理解为 将行的单链表和列的单链表结合起来存储稀疏矩阵称为十字链表, 每个节点表示一个非零元素。

三元组解释:

1、所谓“三元组”是指图形的几何元素构成、图线间的拓扑关系和尺寸约束。如果一组图形的前二元相同而只是尺寸大小不同,则这组图形构成一族形状相同的系列化图形。

2、把组成一个元素的三个数称为三元组。一个三元组包含以下三部分的内容SDO_STARTING_OFFSET表明每个几何元素的第一个坐标在SDO_ORDINATES数组中的存储位置。

3、…Mt:N2)的表示称为三元组...…Mt称为标号,N1、N2为结点R为关系。当n≠0时,称Li为对结点N1的修饰。t≠0时,称Mj为对结点N2的修饰。

参考资料:网络:十字链表

网络:三元组

‘捌’ 稀疏矩阵定义以及存储格式(COO,CSR,CSC)

网络:在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵。定义非零元素的总数比上矩阵所有元素的总数为矩阵的稠密度。 简单来说,稀疏矩阵就是绝大部分都是0的矩阵 ,只包含很少的非零值.

比如,

上述稀疏矩阵非零元素有9个,26个零值.稀疏性是74%.

稀疏矩阵因为绝大部分都是0元素,如果我们仍然按照普通方式存储,无疑会 浪费很多空间 ;同时如果进行运算时,0元素对最终结果也没有帮助, 增加了许多无效计算 . 因此,我们需要设计出新的存储方式,或者说数据结构来存储稀疏矩阵.比较常见的有:

对于稀疏矩阵的存储,为了达到压缩的目的(节省存储空间),只存储非0元素值,但是也要保留非零元素的位置,方便恢复.所以,我们存储时不仅存储非零元素值,同时存储其坐标位置(row,column). 针对这两者的存储,会出现不同的设计方案.这里主要介绍COO,CSR和CSC存储格式.

我们使用三个数组row,column和data分别用来存储非零元素坐标的row_index,col_index,以及数值.比如:

NNO:The number of nonzero.矩阵非零元素个数. 三个数组的长度都是NNO.data[i]在原稀疏矩阵中的坐标为(row[i],col[i]]).

可以发现,这种存储方式中,row数组和column数组中有一定的重复元素.我们是否可以针对这个冗余特性进一步进行压缩?之后出现CSR,CSC,分别是对row数组和column数组进行了压缩.

对COO稀疏矩阵存储格式的三个数组中的row数组进行压缩.其他两个数组保持不变;三个数组分别是row_ptr,columns和data.其中columns和data数组长度均为NNO(矩阵的非零元素个数). 如何对COO的row进行压缩?

row_ptr存储的是每行的第一个非零元素距离稀疏矩阵第一个元素的偏移位置;

由row_ptr我们可以知道每行非零元素在data中的index范围.第i行的非零元素为data[row_ptr[i]:row_ptr[i+1]],对data数组的切片,不包含data[row_ptr[i+1]];同时第i行非零元素的col坐标分别为columns[row_ptr[i]:row_ptr[i+1]];对data和columns的访问相似,index是相同的.

如上图中,第0行非零元素在data中是data[0:2],就是1,7;列坐标为columns[0:2],就是0,1,第1行非零元素为data[2:4],有两个元素2和8,列坐标分别为columns[2:4],1和2.

方便进行行操作.

和CSR类似.只不过对列进行压缩,row和data保持不变.

方便进行列操作.

‘玖’ 怎样用c语言实现稀疏矩阵的带行指针向量的链接储存

double fMatrix[10][10]={...};
这是静态数组表示矩阵,当然你可以使用链表的方式来存储
一个链表表示一行,每行存储链表的头元素指针就行。。。

‘拾’ 对稀疏矩阵进行压缩存储的缺点

对稀疏矩阵进行压缩存储的缺点失去随机存储功含缓能。稀疏矩阵压缩存储后,必会失去随机存取功能。稀疏矩阵在采用压缩存储后将会失去随机存储的功粗皮能。在这种矩阵中,非零元素的分布是没有规律的,为了压缩存储,就将每一个非零元素的值和所在的行、列号做为一个结点存放在一起,结点组成的线性表中岩老差叫三元组表,已不是简单的向量,无法用下标直接存取矩阵中的元素。