壓縮矩陣之轉置

#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章