科学与工程计算有一个特殊的数学对象,那就是矩阵。如何将矩阵中的各个元素存储在计算机中,数组就是一个很好的选择。我们通常会遇到三种类型的矩阵:
普通矩阵特殊矩阵:对称矩阵、上三角矩阵、下三角矩阵、对角矩阵等稀疏矩阵特殊矩阵和稀疏矩阵压缩存储的目的是节省存储空间。矩阵的下标是从1开始,而将改矩阵压缩成内存中的一维空间时,与该一维空间所对应的数组下标是从0开始。
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢a11a21a31⋮ai1a12a22a32⋮ai2a13a23a33⋮ai3⋯⋯⋯⋱⋯a1ja2ja3j⋮aij⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥
上三角矩阵: ⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢a11mm⋮ma12a22m⋮ma13a23a33⋮m⋯⋯⋯⋱⋯a1ja2ja3j⋮aij⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥
下三角矩阵: ⎡⎣⎢⎢⎢⎢⎢⎢⎢a11a21a31⋮ai1ma22a32⋮ai2mma33⋮ai3⋯⋯⋯⋱⋯mmm⋮aij⎤⎦⎥⎥⎥⎥⎥⎥⎥
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢a11a210000a12a22a320000a23a33a430000a34a44a540000a45a55a650000a56a66⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢00−3001512000180900240000000−70000000014000000000⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥
三元组顺序表(顺序存储结构)
#define MAXSIZE 12500//非零元素最大个数 typedef struct{ int i,j;//非零元素的行下标、列下标 elemtype e; }Triple; typedef struct{ Triple data[MAXSIZE+1];//data[0]未用 int mu,nu,tu;//行数、列数、非零元素个数 }TSMatrix; 行逻辑连接的顺序表(链式存储结构) 有时为了提高效率,可以随机存储任意一行的非0元素,这样,就需要知道每一行的第一个非0元素在三元组表中的位置。为此可以添加一个辅助数组来实现: typedef struct{ Triple data[MAXSIZE+1];// data[0]未用 int rpos[MAXCO+1]// 各行第一个非零元的位置表,rpos [0]未用 int mu,nu,tu;//行数、列数、非零元素个数 }RLSMatrix; 十字链表(链式存储结构) 将每行的非0元素组成一个链表,每列的非0元素组成一个链表。链表中的每个结点有5个域,有3个域与三元组中信息一样,保存行标、列标、元素值。剩下的2个域分别保存所在行下一个元素和所在列下一个元素。 最后将行链表的头指针组成一个数组,将列链表的头指针组成另一个数组,这样就形成了一个十字交叉的链表。