矩阵的压缩存储
一、矩阵的分类
1、特殊矩阵:其矩阵值在在矩阵中分布有规律 2、稀疏矩阵:矩阵的非零值在矩阵中占比小于0.05的矩阵,即零值占比在95%以上 3、一般矩阵:不属于上面的两种矩阵
二、矩阵的存储方式
1、特殊矩阵的存储方式
1、特殊矩阵包括三角矩阵,带状矩阵 都是使用顺序存储
2、稀疏矩阵的存储方式
稀疏矩阵的存储方式有两种,其一:三元组顺序表(顺序存储)其二:十字链表(链式存储)
1、稀疏矩阵的三元组顺序表存储
3矩阵的转置
1、一般矩阵转置
2、 稀疏矩阵的一般转置
3、稀疏矩阵的快速排序
假如我们直接知道转置前的三元组数组的每个元素在转置后的三元组数组中位置,我们就可以直接转了 要想知道转置后的位置,我们必须要总结转置前的三元组数组的更详细信息。 由于转置后行列互换,所以转置后的三元组数组是按照行顺序记录的,所以我们要知道转置前矩阵的每列元素个数mun(j),另外我们还需要知道转置前的矩阵的每一列元素的第一个非0元素在转置后的三元组数组中的位置Pos(j) 那么我们就可以根据mun(j)和Pos(j)来确定转置前的三元组数组的每个元素在转置后的三元组数组中位置 计算方法
代码
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
typedef int Status
;
typedef int Boolean
;
typedef int ElemType
;
#define MAX_SIZE 100
struct Triple
{
int i
, j
;
ElemType e
;
};
struct TSMatrix
{
Triple data
[MAX_SIZE
+ 1];
int mu
, nu
, tu
;
};
Status
CreateSMatrix(TSMatrix
&M
);
void PrintSMatrix(TSMatrix M
);
void display(TSMatrix M
);
void PrintSMatrix1(TSMatrix M
);
void CopySMatrix(TSMatrix M
, TSMatrix
&T
);
Status
AddSMatrix(TSMatrix M
, TSMatrix N
, TSMatrix
&Q
);
Status
SubtSMatrix(TSMatrix M
, TSMatrix N
, TSMatrix
&Q
);
void TransposeSMatrix(TSMatrix M
, TSMatrix
&T
);
int main() {
TSMatrix M
;
CreateSMatrix(M
);
PrintSMatrix(M
);
display(M
);
}
Status
CreateSMatrix(TSMatrix
&M
)
{
int i
, m
, n
;
ElemType e
;
Status k
;
printf("请输入矩阵的行数,列数,非零元素数:");
scanf_s("%d, %d, %d", &M
.mu
, &M
.nu
, &M
.tu
);
if (M
.tu
> MAX_SIZE
)
return ERROR
;
M
.data
[0].i
= 0;
for (i
= 1; i
<= M
.tu
; i
++)
{
do
{
printf("请按行序顺序输入第%d个非零元素所在的行(1~%d),列(1~%d),元素值:", i
, M
.mu
, M
.nu
);
scanf_s("%d,%d,%d", &m
, &n
, &e
);
k
= 0;
if (m
<1 || m
>M
.mu
|| n
<1 || n
>M
.nu
)
k
= 1;
if (m
< M
.data
[i
- 1].i
|| m
== M
.data
[i
- 1].i
&&n
<= M
.data
[i
- 1].j
)
k
= 1;
} while (k
);
M
.data
[i
].i
= m
;
M
.data
[i
].j
= n
;
M
.data
[i
].e
= e
;
}
return OK
;
}
void PrintSMatrix(TSMatrix M
)
{
int i
;
printf("%d行%d列%d个非零元素。\n", M
.mu
, M
.nu
, M
.tu
);
printf("行 列 元素值\n");
for (i
= 1; i
<= M
.tu
; i
++)
printf("-M