三种转置矩阵方法

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

输入文件格式为一个矩阵

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值