程序设计百科

广告

稀疏矩阵----数据处理类数据结构与算法2-1

2012-06-19 10:03:30 本文行家:玻尔特.李

稀疏矩阵的存储结构是三元组表,在运算算法中,用矩阵逻辑结构定位数据处理范围,选择算法主序,发现驱动元素或变量的数据映射范围,根据已知实体与目标实体间的映射关系和输出实体的逻辑结构,选择算法主序,输出结构与输出方法。在源程序分析中发现原子功能模块。 说明:本文面对的是有一定计算机软件认识的大学生或者程序设计人员。

       稀疏矩阵在数据结构中不是重点,但是稀疏矩阵既是数据处理的大范围内,又具有一般程序设计与算法结构的基本特征。大学阶段遇到的科学计算类程序不多,稀疏矩阵运算(转置、乘法)的算法是应掌握的起步阶段。

我想要怒放的生命我想要怒放的生命

 

§1转置算法

算法对运算数据关联范围的设置不同,导致稀疏矩阵的转置算法的效率不同。

一.稀疏矩阵转置程序1的分析

1.什么是转置

Mmn-->Tnm其中aij=bji

(1i≤m, 1j≤n。i,j可看作与M,T无关的表示,也可以看作矩阵M为主动的下标表示方法) ,而且aij∈M, bji∈T。

      矩阵M已知,矩阵T未知。因此在编程时,应考虑以哪个矩阵为算法主序,这是一个出发点。

(1)MT的行列互换à两个矩阵的行数mu列数nu互换,

T.mu=M.nu=n T.nu=M.mu=mT为主动。

(2)矩阵元素T(i,j)=M(j,i),矩阵T的第i行第j列元素与矩阵M的第j行第i列元素相等。以T的元素为驱动,因为能从M的元素得到T的元素,所以建立表达式就能得到T元素的值。(在程序中,是否用矩阵T的顺序为算法线索?)

     转置矩阵的非0元个数相同,T.tu=M.tu   

(3)0元素多的稀疏矩阵的转置而言,与一般矩阵的转置不同。稀疏矩阵的非0元素aij,在程序中用三元组(i,j,aij)表示,i,j表示行数列数。因为不再按照矩阵的结构mn列转置,不使用二维数组作为存储,所以必须记录每一个非0元素所在行列的位置。在规则的二维数组中,矩阵的行列通过元素的下标识别,元素在矩阵中的位置通过下标得到。因此一般矩阵用二维数组为存储结构。二维数组是物理存储结构的逻辑形式,可称为逻辑存储结构。

2.稀疏矩阵的一维数组存储结构

      从操作系统可知,数据的存储方式有三种:连续(顺序)方式,链接方式,索引方式。矩阵不能直接用在计算机中,应选择顺序存储结构二维数组,存放元素。稀疏矩阵的非0元以矩阵行序为序存储在一维数组中,每一行元素的数目不同,可称为非规则数组。

      从稀疏矩阵到一维数组是从矩阵结构到以元素次序为主序的逻辑结构变换。稀疏矩阵的一维数组的非0元素是记录(i,j,aij)。稀疏矩阵三元组表的顺序存储方式,称为三元组顺序表,选用一维数组。三元组表还可用链表表示。

****这里有两个转换或者两个关系。1.数学表示实体到计算机存储实体的转换。eg.矩阵到一维数组;2.数学逻辑结构到存储逻辑结构的转换。eg.矩阵的行列结构+稀疏矩阵非0元素到一维数组中非0元同行同列+顺序表示的转换。*****注释

数据结构:三元组顺序表

//----稀疏矩阵的三元组表顺序存储表示----//

#define   MAXSIZE   12500

Typedef struct{

       int    i,j;             //该非0元的行下标row和列下标col

                                //有行下标或列下标相同的三元组

      ElemType  e;

}Triple;    //三元组元素

 

Typedef struct{

     Triple   data[MAXSIZE+1];  //0元三元组表,data[0]未用

     int  mu,nu,tu;      //矩阵的行数,列数和非0元个数

}TSMatrix  //三元组表

      三元组表的顺序以矩阵行序为主序。非0元的三元组是以矩阵行序为主序排列的。这两个表述有区别。三元组表与三元组不同,用三元组元素好像没有必要。

3.稀疏矩阵转置运算程序-----一维数组存储结构

Status transposeSMatrix (TSMatrix MTSMatrix &T)

                                                                   //稀疏矩阵从MT转置

{

  T.mu=M.nu;T.nu=M.nu;                                  //矩阵行数列数互换

  T.tu=M.tu;                                           //转置矩阵非零元个数一样

  if(T.tu){                                                     //矩阵非0元个数不为0

     q=1;                                   //q=1是行排列数组T.data[]工作游标

     for(col=1;col<=M.nu;++col)     //colM的列,共循环列数nu次,

                                                         并不是整个矩阵次数

        for(p=1;p<=M.tu;++p)                     //col相关的数据范围:M

                                                     的全部非0元。数组M.data[]

                                                     的工作游标pp的上下界

                                                                [1,M.tu],以一个非0元为一

                                                     次循环,同时p增加1。

                 if(M.data[p].j==col){           //如果M的非0元的列=col

                   T.data[q].i=M.data[p].j;                     //T[q]=M[p]

                                                                     为什么q时,T[q]=M[p]?

                   T.data[q].j=M.data[p].i;

                   T.data[q].e=M.data[p].e;

                    ++q;}                          //q增加,循环返回到pfor循环;

                                              当一次遍历M.data[]数组结束,循环

                                              返回colfor循环。

                 }//if(T.tu)

    }//TransposeSMatrix稀疏矩阵转置算法

4.算法的解释:

      按照M的列的顺序,在M.data[]中寻找M的每一列的全部元素,这一列元素正是T的相同行值的全部元素。共有nu次列数循环,每次循环遍历一次M.data[]。将M.data[]M的行排列数组重排到M的列排列数组,这个数组等于T的行排列数组。data[]以矩阵的行序为主序.

      为什么是M的列序,因为以T的行序为一维数组的主序。比较M,T之间的差异,可知重排三元组表元素之间的次序可实现矩阵转置。T.data[]M.data[]中元素次序的重排,这个次序的重排不是随便的重排。而是以T的行序为序,T的行序就是M的列序。

      将T的行序,作为重排M.data[]中元素的主序。稀疏矩阵的转置算法,对要重排的矩阵数据,是以目标矩阵T的行序(M的列序)做为算法主序。这是编程的出发点。

      将M同一列的数据有序存放在T的一维数组中。M的列序从1N,而且M同一列的数据仍然是按从上到下的行序([1,m]),作为部分离散有序形式,存在在一维数组M.data[]中,符合T.data[]T的行序排列的要求。

1)什么是算法主序?

     目标实体元素求解的顺序。T.data[]递增序,只有一个方向,称为求解线索(方向)。求解线索是算法线索集合的一个元素。

       T.data[]按照矩阵行排列(一维数组的序是矩阵行排列),因此对应已知矩阵M列序。所以M的列序作为算法主序,使M成为驱动数据。

2)目标T与已知M的映射关系

      形的对应:行数,列数,非零元个数。 

      序的对应:行序列序。

      层次的对应:每一行每一列非0元的个数,每一行每一列第一个非0元的位置。                     

      对转置运算而言:T每一行非0元个数与M每一列非0元个数相同。T每一行第一个非0元位置与M每一列第一个非0元位置的关系。T的行序等于M的列序。

3)算法的关键是矩阵数据按照谁的序,进行程序处理。按照已知矩阵,还是目标矩阵。

      按照目标矩阵的序(即行序),从矩阵数据M.data中进行选择。

矩阵有两个性质:1.层次结构2.顺序,可认为是元素的顺序。这个转置算法用递增序,因此还可从用矩阵层次结构编程。

       用M矩阵的行序,或者用精确定位(见第二节)的方法。

4)矩阵的一维数组可看做mu个行数组。稀疏矩阵的行数组并不规则,相同行的三元组元素的行下标(域)相同。从相邻的特性可知,根据data[1]与行元素的个数,可知下一行的第一个元素的位置(下标)。这与基址存储器与段长存储器的做用一样。

注意:用行下标变换的方法,求行数组的边界似乎不优美。

分享:
标签: 自然科学 计算机理论 | 收藏
参考资料:
[1] 严蔚敏,吴伟民.数据结构C语言版.清华大学出版社.1999
百科的文章(含所附图片)系由网友上传,如果涉嫌侵权,请与客服联系,我们将按照法律之相关规定及时进行处理。如需转载,请注明来源于www.baike.com

本文行家向Ta提问

玻尔特.李软件专业硕士生,编程,计算机硬件设计,网络。

行家更新