#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<ctime>
#include<fstream>
const int MAXN=10001;
using namespace std;
typedef struct Tir{
int i,j;
int val;
}Node;
class Matrix{//矩阵三元组类
public:
Node arr[MAXN];
int rows,cols,nums;
Matrix()
{
nums=0;
}
};
bool Exist(int nowi,int nowj,class Matrix Mat)
{
for(int i=1;i<=Mat.nums;i++)
{
if(Mat.arr[i].i==nowi&&Mat.arr[i].j==nowj)
return true;
}
return false;
}
bool cmp (class Tir a,class Tir b)//三元组排序方法
{
if(a.i!=b.i)
return a.i<b.i;//行小的在前面
else return a.j<b.j;//行相同时,列小的在前面
}
int getval(int nowi,int nowj,class Matrix Mat)
{
for(int i=1;i<=Mat.nums;i++)
{
if(Mat.arr[i].i==nowi&&Mat.arr[i].j==nowj)
return Mat.arr[i].val;
}
}
void Transone(class Matrix Matarr)
{
clock_t start,end;
start=clock();
ofstream f2;
f2.open("matrixdata1.txt",ios::out);
class Matrix out;//转置结果三元组类
int point=0;
out.rows=Matarr.cols;
out.cols=Matarr.rows;
out.nums=Matarr.nums;
for(int i=0;i<=Matarr.cols;i++)//遍历原矩阵的列,同为结果矩阵的行
{
for(int j=0;j<=Matarr.rows;j++)//遍历原矩阵的行,同为结果矩阵的列
{
if(Exist(j,i,Matarr))//查询是否有这个元素
{
out.arr[++point].i=i;
out.arr[point].j=j;
out.arr[point].val=getval(j,i,Matarr);//获取元素值
}
}
}
for(int i=1;i<=Matarr.nums;i++)
f2<<out.arr[i].i<<" "<<out.arr[i].j<<" "<<out.arr[i].val<<endl;//输出到文件中
f2.close();
end=clock();
cout<<"方法一时间为:"<<(double)(end - start)/CLOCKS_PER_SEC<<"秒"<<endl; //记录CPU时间
}
void Transtwo(class Matrix Matarr)
{
clock_t start1,end1;
start1=clock();
class Matrix out;
int now=1;
ofstream f2;
f2.open("matrixdata2.txt",ios::out);
out.rows=Matarr.cols;
out.cols=Matarr.rows;
out.nums=Matarr.nums;
for(int i=0;i<=Matarr.cols;i++)//遍历原矩阵的列 同为转置矩阵的行
{
for(int po=1;po<=Matarr.nums;po++)//遍历三元组每一个元素
{
if(Matarr.arr[po].j==i)//列标号即为转置后的行标号
{
out.arr[now].j=Matarr.arr[po].i;
out.arr[now].i=Matarr.arr[po].j;
out.arr[now].val=Matarr.arr[po].val;
now++;
}
}
}
for(int i=1;i<=out.nums;i++)
f2<<out.arr[i].i<<" "<<out.arr[i].j<<" "<<out.arr[i].val<<endl;//输出到文件中
f2.close();
end1=clock();
cout<<"方法二时间为:"<<(double)(end1 - start1)/CLOCKS_PER_SEC<<"秒"<<endl; //记录时间
}
void Transthree(class Matrix Matarr)
{
clock_t start1,end1;
start1=clock();
class Matrix out;
int now=1;
ofstream f2;
f2.open("matrixdata3.txt",ios::out);
int rowNum[1001],rowStart[1001];
out.rows=Matarr.cols;
out.cols=Matarr.rows;
out.nums=Matarr.nums;
rowStart[0]=1;
for(int i=0;i<=Matarr.cols;i++)
rowNum[i]=0;//将rowNum清零
for(int i=1;i<=Matarr.nums;i++)
rowNum[Matarr.arr[i].j]++;//统计原矩阵每列非零元素个数
for(int i=1;i<=Matarr.cols;i++)
rowStart[i]=rowStart[i-1]+rowNum[i-1];//求出转置矩阵每一行三元组存储的起始位置
for(int i=1;i<=Matarr.nums;i++)
{
int pos=rowStart[Matarr.arr[i].j];//找到当前三元组应当存储的位置
out.arr[pos].i=Matarr.arr[i].j;//存储该元素
out.arr[pos].j=Matarr.arr[i].i;
out.arr[pos].val=Matarr.arr[i].val;
rowStart[Matarr.arr[i].j]++;//这个位置已存,将该行应当存储位置改为下一个
}
for(int i=1;i<=Matarr.nums;i++)
f2<<out.arr[i].i<<" "<<out.arr[i].j<<" "<<out.arr[i].val<<endl;//输出到文件
f2.close();
end1=clock();
cout<<"方法三时间为:"<<(double)(end1 - start1)/CLOCKS_PER_SEC<<"秒"<<endl;
}
int main(){
bool getflag=1;
int totalcol=0,totalrow=0;
char getin;
class Matrix Matarr;
struct Tir tempTir;
int total=0,temp,nowrow=0,nowcol=0;
ifstream f1;
f1.open("matrix.txt");//打开文件matrix.txt
if(!f1)
{
cout<<"文件打开有误";
return 0;
}
while(!f1.eof())//第一次读入先判断矩阵行列大小方便第二次读入来存储
{
f1.get(getin);
if(getin==' ')
continue;
else if('0'<=getin&&getin<='9')
{
temp=getin-'0';
if('0'<=f1.peek()&&'0'<=f1.peek()<='9')//如果是多位数,则跳过然后只需要列元素加一次
continue;
if(getflag)
totalcol++;//列长度加一
}
else if(getin=='\n')
{
getflag=0;//一行统计完毕
totalrow++;//行元素加一
}
}
totalcol--;
cout<<totalrow<<" "<<totalcol<<endl;
Matarr.cols=totalcol;
Matarr.rows=totalrow;
f1.close();
f1.open("matrix.txt");
while(!f1.eof())
{
f1>>temp;
if(temp!=0)
{
Matarr.arr[++Matarr.nums].i=nowrow;//三元表元素加一
Matarr.arr[Matarr.nums].j=nowcol;
Matarr.arr[Matarr.nums].val=temp;
}
nowcol++;
if(nowcol==totalcol+1)//此时一列已经填满,开始下一列
{
nowcol=0;
nowrow++;
}
}
for(int i=1;i<=Matarr.nums;i++)
cout<<Matarr.arr[i].i<<" "<<Matarr.arr[i].j<<" "<<Matarr.arr[i].val<<endl;
Transone(Matarr);//第一种方法
Transtwo(Matarr);//第二种方法
Transthree(Matarr);//第三种方法
return 0;
}
输入文件格式为一个矩阵