矩阵的快速转置和矩阵加法

1.稀疏矩阵A,B均采用三元组顺序表表示,验证实现矩阵A快速装置算法,并设计,验证矩阵A,B相加得到矩阵C的算法。
   (1)从键盘输入矩阵的行数和列数,随机生成稀疏矩阵。
   (2)设计算法将随机生成的稀疏矩阵转换成三元组表现形式存储。
   (3)设计算法将快速装置得到的与相加得到的三元组顺序表分别转换成矩阵形式。

   (4)输出随机生成的稀疏矩阵A,B及其三元组顺序表,快速装置得到的三元组顺序表及其矩阵形式。

实验代码:

#include <stdio.h>
#include <stdlib.h>
#include<time.h>
typedef int ElemType;
typedef int Status;
//定义三元组类型
typedef struct t{
	int i;
	int j;
	int v;
}syzleixing;
// 通过三元组类型定义出以三元组形式存储的稀疏矩阵类型 
typedef struct {
	syzleixing data[10000];
	int mu,nu,tu;
}syzmatrix;
/*矩阵快速转置*/ 
void kzzmartix(syzmatrix M,syzmatrix *T){
	int q,col,p;
	int num[M.tu+1],cpot[M.tu+1];
	
	//初始化T
	T->mu=M.nu;	T->nu=M.mu;	T->tu=M.tu; 
	if(T->tu > 0){
		for(col=1;col<=M.nu;col++){
			num[col]=0;
		}
		for(p=1;p<=M.nu;p++){
			++num[M.data[p].j];
		}
		cpot[1]=1;
		for(col=2;col<=M.nu;col++){
			cpot[col]=cpot[col-1]+num[col-1];
		}
		
		for(p=1;p<=M.tu;p++){
			col=M.data[p].j; q=cpot[col];
			T->data[q].i=M.data[p].j;
			T->data[q].j=M.data[p].i;
			T->data[q].v=M.data[p].v;
			cpot[col]++;
		}
	}
}
/*输出三元组*/ 
void printmatrix(syzmatrix T){
	for(int i=1;i<=T.tu;i++)
		printf("%d %d %d\n",T.data[i].i,T.data[i].j,T.data[i].v);
} 
/*输出矩阵*/ 
void print(ElemType **a,int m,int n){
	for(int i=1;i<=m;i++){
		
		for(int j=1;j<=n;j++){
			if(j==1){
				printf("!");
			}
			printf("%d ",a[i][j]);
			if(j==n){
				printf("!");
			}
		}
		
		printf("\n");
	}
}
/*---生成随机矩阵---*/
ElemType** randzz(int m,int n){
	m++,n++;
	ElemType **a;
	a=(ElemType**)malloc(m*sizeof(int*));//0号单元不用 ,所以m+1 
	for(int i=1;i<=m;i++){
		a[i]=(ElemType*)malloc(n*sizeof(int));//同m 
	}
	for(int i=1;i<=m;i++){
		for(int j=1;j<n;j++){
			if(rand()%7>1){//为了使矩阵稀疏 
				a[i][j]=0;
			}else{
				a[i][j]=rand()%3+1;
			}
			
		}
	} 
	return a;
}
/*稀疏矩阵 转换成 三元组*/ 
syzmatrix zh1(ElemType **sj,syzmatrix *M){
	
	int k=0;
	for(int i=1;i<=M->mu;i++){
		for(int j=1;j<=M->nu;j++){
			if(sj[i][j]!=0){
				M->data[++k].v=sj[i][j];
				M->data[k].i=i;
				M->data[k].j=j;
				M->tu++;
			}
			
		}
	} 
}
/*三元组 转换为 稀疏矩阵 */
ElemType** zh2(syzmatrix M){
	int m=M.mu+1,n=M.nu+1;
	ElemType **a;
	a=(ElemType**)malloc(m*sizeof(int*));//0号单元不用 ,所以m+1 
	for(int i=0;i<m;i++){
		a[i]=(ElemType*)malloc(n*sizeof(int));//同m 
	}
	/*将矩阵初始化为0*/
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			a[i][j]=0;
		}
	}
	for(int i=1;i<=M.tu;i++){
		if(M.data[i].v!=0){
			a[M.data[i].i][M.data[i].j]=M.data[i].v;
		}
	}
	return a;
}
void print2(syzmatrix M){
	
	for(int i=1;i<=M.tu;i++){
		printf("( %d, %d, %d)\n",M.data[i].i,M.data[i].j,M.data[i].v);
	}
}

void swap(syzleixing *C,syzleixing A){
	C->i=A.i;
	C->j=A.j;
	C->v=A.v;
}
/*矩阵加法*/
syzmatrix add(syzmatrix A,syzmatrix B,syzmatrix *C){
	
	C->nu=A.nu,C->mu=A.mu;
	int i=1,j=1,k;
	for(k=1;i<=A.tu&&j<=B.tu;k++){
		if(A.data[i].i < B.data[j].i){
			swap(&(C->data[k]),A.data[i++]);
		}else if(A.data[i].i > B.data[j].i){
			swap(&(C->data[k]),B.data[j++]);
		}else{
			if(A.data[i].j < B.data[j].j){
				swap(&(C->data[k]),A.data[i++]);
			}else if(A.data[i].j > B.data[j].j){
				swap(&(C->data[k]),B.data[j++]);
			}else{
				C->data[k].i=A.data[i].i;
				C->data[k].j=A.data[i].j;
				C->data[k].v=A.data[i].v+B.data[j].v;
				j++,i++;
			}
		}
			C->tu++;
	}
	while(i<=A.tu){
		swap(&(C->data[k++]),A.data[i++]);C->tu++;
	}
	while(j<=B.tu){
		swap(&(C->data[k++]),B.data[j++]);C->tu++;
	}
}
int am,an,bm,bn;
int main(){
	srand((int)time(NULL));
	//初始化M
	syzmatrix T,A,B,C;
	ElemType **a=NULL,**b;
	
	printf("请输入矩阵 A 的行数:");
	scanf("%d",&am);
	printf("清输入矩阵 A 的列数:");
	scanf("%d",&an);
	printf("请输入矩阵 B 的行数:");
	scanf("%d",&bm);
	printf("清输入矩阵 B 的列数:");
	scanf("%d",&bn);
	
	A.nu=an,A.mu=am,A.tu=0; 
	B.nu=bn,B.mu=bm,B.tu=0;
	 
	a=randzz(am,an);
	b=randzz(bm,bn);
	printf("\n随机生成的矩阵 A:\n");
	print(a,am,an);
	zh1(a,&A);
	printf("A 的三元组形式:\n");
	print2(A);
    kzzmartix(A,&T);
    printf("A 的转置 T:\n");
	print(zh2(T),an,am);
	printf("T 的三元组形式:\n"); 
	print2(T);
	printf("\n随机生成的矩阵 B:\n");
	print(b,bm,bn);
	zh1(b,&B);
	printf("B 的三元组形式:\n");
	print2(B);
	
	C.tu=0;
	add(A,B,&C);
	int cm=am,cn=an;
	
	printf("矩阵 C=A+B :\n");
	print(zh2(C),cm,cn);
	
	printf("C 的三元组形式:\n");
	print2(C);
}


运行结果:


  • 12
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值