用三元组存储稀疏矩阵,实现其快速转置c语言代码,三元组稀疏矩阵快速转置C语言算法...

1-468-png_6_0_0_454_362_364_183_892.5_1212-918-0-28-918.jpg

1-84-png_6_0_0_0_0_0_0_892.5_1212-204-0-501-204.jpg

1-81-png_6_0_0_0_0_0_0_892.5_1212-171-0-590-171.jpg

三元组稀疏矩阵快速转置C语言算法

徐光联

摘要:三元组稀疏矩阵的快速转置算法在《数据结构》课程中是一个难点,这里给出三元组稀疏矩阵的转置算法详细讲解,并给出C语言算法的源程序。

关键词:三元组;稀疏矩阵;快速转置

{int m,n,t; /* m 表示行数, n 表示列数,t 表示非零元素个数 */

Mat data[MAXSIZE]; /* 所存储元素的最大个数 */)Spmatrix;

Spmatrix a,b;

要假定结构中data域表示非零元素的三元组是以行为主顺序排列的。(算式1)表示了稀疏矩阵M和N中data域的排列情况。这种表示方法,在矩阵足够稀疏的情况下,对存储空间的需求量比通常的方法少得多。

一、前 言

三元组稀疏矩阵的快速转置算法在《数据结构》课程中是一个难点,处理这个知识点很费时间,在教学过程中,往往受课时限制,采取略过不讲的办法,有的教材就干脆把它省去不提。日常生产和科研过程中,数字计算中大量使用了矩阵,为了减少运算量,提高运算效率,这个算法很有用处。这里给出三元组稀疏矩阵的快速转置算法详细过程,并给出C语言描述的实例。

矩阵转置定义为: m行n列矩阵M(m,n) 转换为n行m列N

矩阵,即行列互换。例如:(n,m)

如M(3,4)转置为N(4,3)。如图-1矩阵转置。

二、数组的三元组表示与稀疏矩阵

在实际应用中,往往会遇到一种大多数元素的值为零的矩阵,只有少部分为非零元素,这些非零元素在矩阵中的分布又没有一定的规律,我们把它记作“零元素个数>>非零元素个数”,即零元素个数远远大于非零元素个数。这种矩阵称为稀疏矩阵(sparse matrix)。例如,下面所示的矩阵M和它的转置矩阵N,在30个元素中只有8个非零元素,显然是个稀疏矩阵。如图-2,稀疏矩阵M转置成N的示意图。

为了节省空间,可以

进行压缩存储,只需存储稀疏矩阵的非零元素。但是,为了实现矩阵的各种运算,除了存储非零元素的值外,还必须同时记下它所在的行和列。可以用一个三元组(i, j, aij)唯一地确定矩阵中的一个非零元素,其中i, j分别表示非零元素的行号和列号,aij表示非零元素的值。

下面就是(算式1)式中矩阵M的(5行6列共有)8个非零元素的三元组表示:

{ (1,1, 8), (1,3, 9) , (2,2,2) , (3,4,3) , (3,6,7), (4,1,6) , (4,3,4) , (5,4,5)}

若以某种方式(以行为主或以列为主的顺序)将8个三元组排列起来,再加上一个表示矩阵M的行数,列数及非零元素的个数的特殊的三元组(5,6,8),则所形成的表就能唯一地确定稀疏矩阵。

三元组表: 假设以顺序存储结构来表示三元组表(tripletable),则得到稀疏矩阵的一种压缩存储方式,即三元组顺序表,简称三元组表。其结构描述如下:

typedef struct{int I,j;

ElemType v;}Mat;

typedef struct2008.No592

1-55-jpg_6_0_______-743-0-0-743.jpg

例如, 我们所说的5×6的矩阵M,若用三元组表来表示,在每个元素占一个存储单元的情况下,则只需要27个存储单元(包括特殊三元组所占的3个单元,可以使用数组[0]单元);若直接用二维数组,按通常办法表示,则需30个单元。矩阵越大,越稀疏,其优越性越明显。

三、稀疏矩阵的转置算法。

矩阵的转置运算是变换元素的位置,把位于(i, j)的元素换到(j, i)位置上。也就是说,把元素的行和列对换。所以一个m×n的矩阵M,它的转置矩阵是一个n×m的矩阵,且N[i,j]=M[j,i],其中,1≤i≤n,1≤j≤m。例如, (算式1)中的矩阵N就是矩阵M的转置矩阵,矩阵N也是一个稀疏矩阵,其非零元素的排列情况如表-1(b)所示。求矩阵M的转置矩阵N,实际上就是由表-1(a)求表-1(b)。

从表-1可以看出,对每个非零元素而言,从M转置到N,分两步,第一步,把a.data的第一列数和第二列数对换,得到的b'.data。因为b’.data是按非零元素在N中的列序排列的,又因为我们已约定,b.data中的非零元素应按照在矩阵N中的行序排列。第二步,将b’.data转换成按非零元素在矩阵N中的行序排列的b.data。转换方法如下:

普通算法分析:按b.data中三元组的次序进行转置。也就是说,按照矩阵M的列序进行转置。显然,为了找到M中的每一列的所有的非零元素,需要对a.data从第1行起整个扫描一遍。由于a.data是以M的行序来存放每一个非零元素的,因此,这样得到的顺序恰好是b.data应有的顺序。其具体算法描述如下:

#define MaxSize 100#define ElemType inttypedef struct{int i,j;ElemType v;}Mat;

typedef struct