转置矩阵方法

这篇博客探讨了两种稀疏矩阵转置的方法:普通方法和快速转置。普通方法的时间复杂度为O(mu*nu),而快速转置通过预计算每列非零元个数,将时间复杂度降低到O(mu+nu)。内容详细解释了两种方法的实现过程,并通过实例说明了快速转置的效率优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

所用例子

 来源:学校课件

1普通方法的注释

稀疏矩阵实现转置功能注释 先自己弄,然后看看老师说的 
//来源数据结构99页 原矩阵为M,转置矩阵为T 
*T.mu=M.nu; T.nu=M.mu; T.tu=M.tu; /*转置矩阵的行数、列数、非零元个数与原矩阵的列数、
行数、非零元的个数相等 */
if(T.tu){//如果非零元各个数不为0 
	q=1;//q是新矩阵的指针,开始指向第一个位置 
	for(col=1;col<=M.tu;++col)//col是T的行序列,即为M的列序列 
	    for(p=1;p<=M.tu;++p) //p是M存储的指针,开始循环 
	        if(M.data[p].j==col){//在小for中,循环1,在M存储块中寻找列向量为1的非零元,书中所举例子
			//是将-3取出来了,然后进行赋值给转置矩阵T的q=1的位置,q开始指向T的第二行,循环2,在M存储块
			//寻找列向量为1的非零元,若存在,则将其赋值给T第二行,若没有,则小循环结束,例子中有为15,
			//然后小循环结束,col变为2,依次继续,形成转置矩阵。 
	        	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;
			}
}//时间复杂度为O(mu*nu)
 

2快速转置

如果能确定预先知道矩阵M中每一列的第一个非零元的位置,在转置则可以直接放到恰当位置,为了确定这些位置,在转置前,应先求得M的每一列中非零元的个数,进而求得每一列的第一个非零元在b.data的位置       

 /*int num[col],cpot[col];num[col]表示矩阵M中第col列中非零元的个数,cpot[col]指示M中
 第col列的第一个非零元在b.data中恰当位置
 显然有cpot[1]=1
 cpot[col]=cpot[col-1]+num[col=1]*/ 
 Status FastTransposeSMatrix(TSMatrix M,TSMatrix &T);
 //采用三元组顺序存储表示,求稀疏矩阵M的转置矩阵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;//先让每一列的非零元个数为0 
	 for(t=1;t<=M.tu;++t)  ++num[M.data[t].j];//求M中每一列含非零元个数 
	 从第一非零元开始,为M.data[1]=12,它的列数为j=2,即M.data[1].j=2,则第二列非0元为1,一次下去 
	 cpot[1]=1;
	 //求第col列中第一个非零元在b.data中的序号
	for(col=2;col<=M.tu;++col) cpot(col)=cpot(col-1)+num(col-1);
	for(p=1;p<=M.tu;++p){//p指向M 
		col=M.data[p].j;//以下为第一轮p=1,第一个元素的列向量2赋值给col,按照例子,col=2 
		q=cpot[col];//q=3 
		T.data[q].i=M.data[p].j;
		T.data[q].j=M.data[p].i;
		T.data[q].e=M.data[p].e;
		++cpot[col];//然后cpot[2]的值加1,即为cpot[2]=cpot[2]+1,在值为8它的列向量为2,即在q=4的位置存储 
	} 

此时的时间复杂度为O(mu+nu)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值