一、实验目的及要求:
掌握稀疏矩阵的三元组表示方法、算法实现。
二、实验内容:
(1) 基于三元组的稀疏矩阵表示与输入、输出方法(必做);
(2) 基于三元组的稀疏矩阵加法(选做);
(3) 基于三元组表示的稀疏矩阵转置(选做);
(4) 基于三元组表示的稀疏矩阵的乘法(选做)。
三、实验准备:
1) 计算机设备;2) 程序调试环境的准备,如TC环境;3) 实验内容的算法分析与代码设计与分析准备。
四、实验步骤和实验过程(该部分不够填写.请填写附页)
1,对实验问题的描述:
采用矩阵的压缩存储可以减少存储矩阵的空间:即为多个值相同的元只分配一个存储空间;对零元不分配存储空间,只需存储稀疏矩阵的非零元。可以采用一个三元组(i,j,a)确定矩阵的非零元,由此,稀疏矩阵可由表示非零元的三元组及其行列数唯一确定。按照稀疏矩阵的三元组实现矩阵的输入输出,相加,相乘的基本操作。
2,算法的数据结构
#define MAXSIZE 1000
typedef struct {
int i,j;
ElemType v;
}Triple;
typedef struct {
Triple
data[MAXSIZE+1];
int mu, nu,
tu;
} Spmatrix;
3,算法基本操作的说明及分析
1,稀疏矩阵的创建
int CreatTriple(Spmatrix *a)
{
int i;
printf("input the max
row and col script and the number of unzero
element(mu,nu,tu)::");
scanf("%d,%d,%d",&a->mu,&a->nu,&a->tu);
printf("input the col
and row script for each Item(i,j,v)::\n");
for(i=1;i<=a->tu;i++)
{
scanf("%d,%d,%d",&a->data[i].i,&a->data[i].j,&a->data[i].v);
}
return OK;
}
2,两个稀疏矩阵相加
int TripleAdd( Spmatrix triple_a, Spmatrix
triple_b, Spmatrix *triple_c)
{
int i=1,j=1,k=1;
if((triple_a.mu!=triple_b.mu)||(triple_a.nu!=triple_b.nu)){
printf("The Script is different!");
exit(0);
}
else{
while(i<=triple_a.tu
&&
j<=triple_b.tu){
if(triple_a.data[i].j
triple_c->data[k].i=triple_a.data[i].i;
triple_c->data[k].j=triple_a.data[i].j;
triple_c->data[k].v=triple_a.data[i].v;
k++;
i++;
}
else
if(triple_a.data[i].j>triple_b.data[j].j){
triple_c->data[k].i=triple_b.data[j].i;
triple_c->data[k].j=triple_a.data[j].j;
triple_c->data[k].v=triple_a.data[j].v;
k++;
j++;
}
else{
triple_c->data[k].i=triple_b.data[j].i;
triple_c->data[k].j=triple_a.data[j].j;
triple_c->data[k].v=triple_a.data[i].v+triple_b.data[j].v;
k++;
i++;
j++;