实验7、矩阵的2种转置运算 (4学时)

实验7、矩阵的2种转置运算 (4学时)
(1)实验目的
       通过该实验,让学生理解矩阵压缩存储的概念、方法等相关知识,掌握用三元组表方式如何进行矩阵的压缩存储,并在此基础上进行转置操作,理解转置和快速转置两种矩阵转置算法的思想。
(2)实验内容
    用三元组表压缩存储矩阵,实现创建矩阵、显示以及教材中介绍的两种转置算法。
(3)参考界面
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181202232745872.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hlbnUxMTE=,size_16,color_FFFFFF,t_70)
(4)验收/测试用例
    创建, 输入:4(行数) 4(列数) 5(非零元个数)
                   (1,1,1) (2,3,2) (3,1,3) (3,4,5) (4,2,4)
       检查是否能拦截元素重复输入
显示
屏幕上输出
                 1  0  0  0
                 0  0  2  0
                 3  0  0  5
                 0  4  0  0
转置
屏幕上输出
                 1  0  3  0
                 0  0  0  4
                 0  2  0  0
                 0  0  5  0
参考代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#define from 12500
using namespace std;
int num1,num2,num3,num4;
typedef struct{
	int i,j;
	int e;
}triple;
typedef struct{
	triple data[from+1];
	int mu,nu,tu;
}TSMatrix;
void print(TSMatrix &M){
	if(M.mu==0&&M.nu==0&&M.tu==0){
		printf("该矩阵被销毁\n");
	}
	int p=1;
	int d;
	for(int a=0;a<M.mu;a++){
		for(int b=0;b<M.nu;b++){
			if((M.data[p].i-1)==a&&(M.data[p].j-1)==b){
				d=M.data[p].e;
				p++;
			}else
				d=0;
				printf("%-4d",d);
		}
		cout<<endl;
	}
}
void TransposeSMatrix(TSMatrix M,TSMatrix &T){
	T.mu=M.mu;T.nu=M.nu;T.tu=M.tu;
	int p,q,col;
	if(T.tu){
		q=1;
		for(col=1;col<=M.nu;col++){
			for(p=1;p<=M.tu;p++){
				if(M.data[p].j==col){
					T.data[q].i=M.data[p].j;
					T.data[q].j=M.data[p].i;
					T.data[q].e=M.data[p].e;
					q++;	
				}
				
			}
		}
	}
	print(T);
}
void FastTransposeSMatrix(TSMatrix M,TSMatrix &Q){
	Q.mu=M.mu;Q.nu=M.nu;Q.tu=M.tu;
	int p,q,t,col,*num,*cpot;
	num=(int *)malloc((M.nu+1)*sizeof(int));
	cpot=(int *)malloc((M.nu+1)*sizeof(int));
	if(Q.tu){
		for(col=1;col<=M.nu;col++) 
			num[col]=0;
		for(t=1;t<=M.tu;t++) num[M.data[t].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];
	    	Q.data[q].i=M.data[p].j;
	    	Q.data[q].j=M.data[p].i;
	    	Q.data[q].e=M.data[p].e;
	    	cpot[col]++;
	   }
    }
	print(Q); 
}
int main()
{
	printf("可执行操作有:\n");
	printf("1----创建矩阵\n");
    printf("2----销毁矩阵\n");
    printf("3----输出矩阵M\n");
    printf("4----转置矩阵\n");
    printf("5----快速转置矩阵\n");
    printf("6----转置矩阵对比\n");
    printf("7----退出\n");
    printf("请输入操作代码:\n");
    TSMatrix M,T,Q; 
    int a;
    int count=0; 
    while(1)
    {
        printf("请输入功能指令:");
        scanf("%d", &a);
        if(a<1||a>7)
        {
            printf("没有此功能\n");
            break;
        }
        if((a==1||a==10)&&count==0){
           count=1;
		} else if((a==1||a==10)&&count==1){
        	printf("请先销毁矩阵");
        	 continue;
		} 
        if(count!=1)
        {
            printf("请先创建矩阵");
            continue;
        }
        switch(a)
        {
            case 1:{
            	num2=0;num3=0;num4=0;
			    cout<<"请输入行数,列数,非零元素个数"<<endl;
				cin>>M.mu>>M.nu>>M.tu;
			    while(true){
				    if(M.tu>(M.mu*M.nu)){
						cout<<"输入错误"<<endl;
						continue; 
					}else{
						break;
					} 	
			    }
			    for(int i=1;i<=M.tu;i++){
			    	cin>>M.data[i].i>>M.data[i].j>>M.data[i].e;
			    	if(M.data[i].i>M.mu){
			    		cout<<"输入的行大于设定的行,输入无效"<<endl;
			    		i--;
			    	}
			    	if(M.data[i].j>M.nu||M.data[i].i<0){
			    		cout<<"输入的列大于设定的列,输入无效"<<endl;
			    		i--;
			    	}
					if(i>=2){
						for(int j=1;j<i;j++){
							if(M.data[i].i==M.data[j].i&&M.data[i].j<M.data[j].j){
								num4=1;
								break;
							}
						}
						if(num4==1){
							cout<<"重新输入"<<endl;
							num4=0;
							i--;
						}
						for(int j=1;j<i;j++){
							if(M.data[i].i==M.data[j].i&&M.data[i].j==M.data[j].j){
								num2=1;
								break;
							}
						}
						if(num2==1){
							cout<<"重新输入"<<endl;
							num2=0;
							i--;
						}
						for(int j=1;j<i;j++){
							if(M.data[i].i<M.data[j].i){
								num3=1;
								break;
							}
						}
						if(num3==1){
							cout<<"重新输入"<<endl;
							num3=0;
							i--;
						}
					}
					 
			    }
				break;
            }	
            case 2:
                M.mu=0;
				M.nu=0;
				M.tu=0;
         		printf("矩阵已被销毁\n");
                break;
            case 3:
            	printf("输出矩阵\n");
			    print(M);
                break;
            case 4:
                printf("……转置矩阵……\n");
    			TransposeSMatrix(M,T);
				break;
            case 5:{
			    printf("……快速转置矩阵……\n");
    			FastTransposeSMatrix(M,Q); 
            	break;
            }
            case 6:{
            	printf("……转置矩阵……\n");
    			TransposeSMatrix(M,T);
			    printf("……快速转置矩阵……\n");
    			FastTransposeSMatrix(M,Q); 
            	break;
            }
        }   
    }
}

 

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值