三元组压缩存储结构的稀疏矩阵的转置运算

三元组压缩存储结构的稀疏矩阵的转置运算

题目:构建矩阵的三元组顺序表压缩存储结构;实现三元组压缩存储结构的矩阵的创建、输出,简单转置和快速转置。

#include <stdio.h>
#define MAXSIZE 200

typedef struct{
	int row,col;
	int e;
}Triple;

typedef struct{
	Triple data[MAXSIZE+1];
	int m,n,len;
}TSMatrix;

void Init(TSMatrix*T){
	T->len=0;
	T->data[1].row=0;
	T->data[1].col=0;
}

//三元组压缩存储 
void Input(TSMatrix*A,int *b){
	int i,j=1,r=6,c=7;
	A->m=r;A->n=c;
	for(i=0;i<42;i++)
		if(b[i]!=0){
			A->data[j].e=b[i];
			A->data[j].row=i/c+1;
			A->data[j].col=(i+1)%c;
			A->len++;
			j++;
		}
	A->len=j-1;		
}

//简单转置 
void Transpose_TSM(TSMatrix*A,TSMatrix*B){
	B->m=A->n;B->n=A->m;B->len=A->len;	
	int i,j=1,k;
	if(B->len>0){
		for(k=1;k<=A->n;k++)
			for(i=1;i<=A->len;i++)
				 if(A->data[i].col==k)
				 {
				 	B->data[j].row=A->data[i].col;
				 	B->data[j].col=A->data[i].row;
				 	B->data[j].e=A->data[i].e;
				 	j++;
				 }
	}
}

//快速转置 
void FastTranspose_TSM(TSMatrix*A,TSMatrix*B){
	int col,t,p,q;
	int num[MAXSIZE],position[MAXSIZE];
	B->m=A->n;B->n=A->m;B->len=A->len;
	if(B->len){
		for(col=1;col<=A->n;col++)
			num[col]=0;
		for(t=1;t<=A->n;t++)
			num[A->data[t].col]++; 	//数组下标计数法
		position[1]=1;
		for(col=2;col<=A->n;col++)
			position[col]=position[col-1]+num[col-1];
		for(p=1;p<=A->len;p++)
		{
		col = A->data[p].col;
		q=position[col];
		B->data[q].row=A->data[p].col;
		B->data[q].col=A->data[p].row;
		B->data[q].e=A->data[p].e;
		position[col]++;
		}		
	}
}

void Output(TSMatrix*T,int *b,int r,int c){
	int i,j,x;
	for(i=0;i<r*c;i++)
		b[i]=0;
	for(i=1;i<=T->len;i++){
		x=(T->data[i].row-1)*c+T->data[i].col-1;
		b[x]=T->data[i].e;
	}
		printf("Output: \n");
	for(i=0;i<r*c;i++){
		printf("%2d ",b[i]);	
		if((i+1)%c==0)
			printf("\n");
	}
} 

int main(){
	int a[60],i;
	int c[10]={0};
	TSMatrix A,B;
	FILE *fp;
	if((fp=fopen("Matrix.txt","r"))==NULL){
		printf("Cannot open file!");
		return;
	}
	for(i=0;i<42;i++)
		fscanf(fp,"%d",&a[i]);
	fclose(fp);
	Init(&A);
	Input(&A,a);
	Output(&A,a,A.m,A.n);
	Transpose_TSM(&A,&B);
	printf("\nAfter transpose:\n");
	Output(&B,a,B.m,B.n);
	FastTranspose_TSM(&A,&B);
	printf("\nAfter fast-transpose:\n");
	Output(&B,a,B.m,B.n);
	
	return 0; 
}

文件:
在这里插入图片描述
在这里插入图片描述

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
三元组压缩存储结构是一种用于稀疏矩阵存储的方法,其中只存储矩阵中非零元素的值和它们的行列坐标。对于一个$n \times n$的矩阵三元组压缩存储结构需要存储$3k$个元素,其中$k$是矩阵中非零元素的个数。 在三元组压缩存储结构下,稀疏矩阵的加法和乘法运算可以通过遍历非零元素实现。具体来说,对于两个稀疏矩阵$A$和$B$,它们的加法运算可以通过如下步骤实现: 1. 初始化结果矩阵$C$,其大小与$A$和$B$相同。 2. 遍历矩阵$A$中的非零元素,将其加到矩阵$C$的对应位置上。 3. 遍历矩阵$B$中的非零元素,将其加到矩阵$C$的对应位置上。 对于稀疏矩阵的乘法运算,可以使用稀疏矩阵乘法算法(Sparse Matrix Multiplication,SMMP)来实现。SMMP算法的基本思想是通过压缩存储结构遍历矩阵中的非零元素,减少乘法运算的次数,从而提高运算效率。具体来说,SMMP算法可以通过以下步骤实现: 1. 对于两个稀疏矩阵$A$和$B$,分别计算它们的转置矩阵$A^T$和$B^T$的三元组压缩存储结构。 2. 对于$A^T$中的每个非零元素$(i,j,A_{ij})$,以及$B^T$中的每个非零元素$(j,k,B_{jk})$,计算它们在结果矩阵$C$中的值$C_{ik}=C_{ik}+A_{ij}B_{jk}$。 3. 最后,将结果矩阵$C$转置即可得到矩阵$AB$的三元组压缩存储结构。 需要注意的是,稀疏矩阵运算通常比稠密矩阵运算更复杂和耗时,因为稀疏矩阵中非零元素的位置比较分散,需要更多的遍历和计算。因此,在进行稀疏矩阵运算时,需要选择合适的算法数据结构,以提高运算效率。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漂流の少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值