1.矩阵定义:一个由 m×n 个元素排成的 m 行(横向)n 列(纵向)的表。
2.矩阵的常规存储:将矩阵描述为一个二维数组
3. 矩阵的常规存储的特点:
可以对其元素进行随机存取;
矩阵运算非常简单;存储的密度为 1。
4.不适宜常规存储的矩阵:值相同的元素很多且呈某种规律分布;零元素多。
5.矩阵的压缩存储:为多个相同的非零元素只分配一个存储空间;对零元素不分配空间。
特殊矩阵:元素值的排列具有一定规律的矩阵。
1. 对称矩阵、下、上三角矩阵、对角线矩阵等
对称矩阵:在一个 n 阶方阵 A 中,若元素满足下述性质:aij = aji 1 ≤ i, j ≤ n 则称 A 为对称矩阵。
M 由 {(1,2,12), (1,3,9), (3,1,-3), (3,6,14), (4,3,24), (5,2,18), (6,1,15), (6,4,-7) } 和矩阵维数 (6, 7) 唯一确定
(三元组 (i, j, aij) 惟一确定矩阵的一个非零元。)
压缩存储原则:存各非零元的值、行列位置和矩阵的行列数。
三元组的不同表示方法可决定稀疏矩阵不同的压缩存储方法。
1、稀疏矩阵的压缩存储方法——顺序存储结构
2、三元组顺序表
#define MAXSIZE 12500
//假设非零元个数的最大值
typedef struct {
int i, j; //该非零元的行列下标
ElemType e;
}Triple;
typedef struct {
Triple data[MAXSIZE + 1];
int mu, nu, tu;
//矩阵的行、列数和非零元个数
}TSMatrix;
#define MAXSIZE 12500
//假设非零元个数的最大值
typedef struct {
int i, j; //该非零元的行列下标
ElemType e;
}Triple;
typedef struct {
Triple data[MAXSIZE + 1];
int mu, nu, tu;
//矩阵的行、列数和非零元个数
}TSMatrix;
已知一个稀疏矩阵的三元组表,求该矩阵转置矩阵的三元组表。
一般矩阵转置算法:
for (col = 1; col <= nu; ++ col)
for (row = 1; row <= mu; ++ row)
T[col][row] = M[row][col];
一般矩阵转置算法时间复杂度:O(mu x nu)
用三元组顺序表存储的矩阵转置算法时间复杂度:O(nu x tu)
结论:
用三元组顺序表存储稀疏矩阵节约存储空间(优点);
tu与mu´nu同数量级时,算法时间复杂度高(缺点);
算法仅适用于 tu << mu´nu 的情况。
mu nu tu分别代表行数、列数、非零元的个数