压缩矩阵之转置

#ifndef _MASTRIX_H_
#define _MASTRIX_H_
#define OK 1
#define ERROR 0
#define MAXSIZE 12500//非零元的最大个数
typedef int ElemType;
typedef struct
{
 int i,j;
 ElemType e;
}Triple;
typedef struct
{
 Triple data[MAXSIZE+1];
 int mu,nu,tu;
}TSMatrix;
void Init(TSMatrix &M);
void Print(TSMatrix M);
int TransposeSMatrix(TSMatrix M,TSMatrix &T);
int FastTransposeSMatrix(TSMatrix M,TSMatrix &T);
#endif

#include"Matrix.h"
#include<iostream>
#include<iomanip>
using namespace std;
//构造矩阵
void Init(TSMatrix &M)
{
 int p;//非零元个数
 cout<<"请输入矩阵的行数、列数、非零元的个数"<<endl;
 cin>>M.mu>>M.nu>>M.tu;//输入矩阵的行数、列数、非零元的个数
 for(p=1;p<=M.tu;p++)
 {
  cin>>M.data[p].i>>M.data[p].j>>M.data[p].e;
 }
}
//遍历
void Print(TSMatrix M)
{
 int k=1,i,j;
 for(i=1;i<=M.mu;i++)
 {
  for(j=1;j<=M.nu;j++)
  {
   if(i==M.data[k].i&&j==M.data[k].j&&k<=M.tu)
   {
    cout<<setw(3)<<M.data[k].e;
    k++;
   }
   else
   {
    cout<<setw(3)<<'0';
   }
  
  }
  cout<<endl;
 }
 /*for(k=1;k<=M.tu;k++)
 {
  cout<<M.data[k].i<<setw(3)<<M.data[k].j<<setw(3)<<M.data[k].e<<endl;
 }
 cout<<endl;*/
}
//按列转置
int TransposeSMatrix(TSMatrix M,TSMatrix &T)
{
 int col,p,q;
 T.mu=M.nu;
 T.nu=M.mu;
 T.tu=M.tu;
 if(T.tu)
 {
  q=1;
  for(col=1;col<=M.nu;col++)
  {
   for(p=1;p<=M.mu;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++;
    }
   }
  }
 }
 return OK;
}
//快速转置
int FastTransposeSMatrix(TSMatrix M,TSMatrix &T)
{
 int copt[20],num[20];
 int col,p,q,t;
 T.mu=M.nu;
 T.nu=M.mu;
 T.tu=M.tu;
 if(T.tu)
 {
  for(col=1;col<=M.nu;col++)
  {
   num[col]=0;
  }
  for(t=1;t<=M.tu;t++)//非零元的个数
  {
   ++num[M.data[t].j];
  }
  copt[1]=1;
  for(col=2;col<=M.nu;col++)
  {
   copt[col]=copt[col-1]+num[col-1];
  }
  for(p=1;p<=M.tu;p++)
  {
   col=M.data[p].j;
   q=copt[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;
   ++copt[col];
  }
 }
 return OK;
}


#include"Matrix.h"
#include<iostream>
using namespace std;
int main()
{
 TSMatrix M,T;
 int select;
 Init(M);
 do
 {
  cout<<"1.转置之前遍历!"<<endl;
  cout<<"2.按列转置!"<<endl;
  cout<<"3.快速转置!"<<endl;
  cout<<"0.操作结束!"<<endl;
  cout<<"请选择:"<<endl;
  cin>>select;
  switch(select)
  {
  case 1:Print(M);
   break;
  case 2:
   if(TransposeSMatrix( M,T)==OK)
   {
    Print(T);
   }
   else
   {
    cout<<"转置出错!"<<endl;
   }
   break;
  case 3:
   if(FastTransposeSMatrix( M,T)==OK)
   {
    Print(T);
   }
   else
   {
    cout<<"转置出错!"<<endl;
   }
   break;
  case 0:
   cout<<"操作结束!"<<endl;
   break;
  default:
   cout<<"输入错误!"<<endl;
  }
 }while(select!=0);
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值