在一个n阶方阵A中,若元素满足下述性质:
a i , j = a j , i a_{i,j}=a_{j,i} ai,j=aj,i则称A为对称矩阵。
(1)只要存储矩阵中上三角或下三角中的元素,让每两个对称的元素共享一个存储空间,这样,能节约近一半的存储空间 (2)元素的个数为: n ( n + 1 ) / 2 n(n+1)/2 n(n+1)/2
上三角矩阵
矩阵下三角部分(不包括对角线)元素全为c(c可以为0)的矩阵
下三角矩阵
矩阵上三角部分(不包括对角线)元素全为0的矩阵
主对角线之外的元素都为0
主对角线及其相邻两侧的一条对角线之外的元素都为0
主对角线即 i = j i=j i=j;主对角线之下的对角线(称低对角线)即 i = j + 1 i=j+1 i=j+1;主对角线之上的对角线(称高对角线)即 i = j − 1 i=j-1 i=j−1。这三条对角线上的元素总数为 3 n − 2 3n-2 3n−2已知矩阵 A 中元素$a_{i,j},其中 1 < = i , j < = n 1<=i,j<=n 1<=i,j<=n。
(1)若数组 B 的下标 k k k 从 0 开始存储,那么 k = 2 + 3 ( i − 2 ) + j − i + 2 − 1 = 2 i + j − 3 k=2+3(i-2)+j-i+2-1=2i+j-3 k=2+3(i−2)+j−i+2−1=2i+j−3 i = f l o o r [ ( k + 1 ) / 3 + 1 ] i=floor[(k+1)/3+1] i=floor[(k+1)/3+1] j = k − 2 i + 3 j=k-2i+3 j=k−2i+3
(2)若数组 B 的下标 k k k 从 1 开始存储,那么 k = 2 + 3 ( i − 2 ) + j − i + 2 = 2 i + j − 2 k=2+3(i-2)+j-i+2=2i+j-2 k=2+3(i−2)+j−i+2=2i+j−2 i = f l o o r [ k / 3 + 1 ] i=floor[k/3+1] i=floor[k/3+1] j = k − 2 i + 2 j=k-2i+2 j=k−2i+2
在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵
三元组表示法
三元组为一个长度为n,表内每个元素都有3个分量的线性表,其3个分量分别为值,行下标和列下标。元素结构体定义如下:
typedef struct { int val; int i,j; }Trimat;在程序中如果要定义一个含有maxterms个非零元素的稀疏矩阵,则
Trimat trimat[maxterms+1];简便起见,也可以不使用结构体直接用二维数组来定义三元组
int trimat[maxterms+1][3];伪地址表示法
伪地址为一个长度为n,表内每个元素都有2个分量的线性表,其2个分量分别为值,伪地址。元素结构体定义如下:
typedef struct { int val; int address; }Trimat;其中,address的计算方法为
address=n(i-1)+j;在程序中如果要定义一个含有maxterms个非零元素的稀疏矩阵,则
Trimat trimat[maxterms+1];简便起见,也可以不使用结构体直接用二维数组来定义伪地址
int trimat[maxterms+1][2];邻接表
邻接表表示法将每一行的非零元素串连成一个链表,链表结点中有三个分量,分别表示该结点对应列号、元素值及指向下一个结点的指针。
十字链表
矩阵的每一行用一个带头结点的链表表示,每一列也用一个带头结点的链表表示,其中最左边和最上边是头结点数组,不存储数据信息
左上角的结点可以视为整个十字链表的头结点,它有5个分量,分别存储矩阵的行数、列数、非零元素个数以及指向两个头结点数组的指针
十字链表结点中除头结点以外的结点就是存储矩阵非零元素相关信息的普通结点。