西西1999333 2021-04-21 19:34 采纳率: 50%
浏览 328
已采纳

C++ 稀疏矩阵的快速转置

源代码如下: 

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 50
#define MAXRC 10
//三元组结构体
typedef struct{
    //所在行数,列数
    int i,j;
    //值
    int e;
}triple;
//存储矩阵的三元组顺序表
typedef struct{
    //存储数据
    triple data[MAXSIZE + 1];
    //存储矩阵的行数,列数和非 0 元的个数
    int mu,nu,tu;
}TSMatrix;
//初始化三元组顺序表
TSMatrix tcreate(int m,int n,int t){
    TSMatrix M;
    int k;
    M.mu = m;
    M.nu = n;
    M.tu = t;
    printf("input %d data ",M.tu);
    printf("i j e ");
    for(k=1;k<=M.tu;k++){
        scanf("%d%d%d",&M.data[k].i,&M.data[k].j,&M.data[k].e);
    }
    return M;
}
//输出矩阵 M 的函数,以二维的格式呈现
void printt(TSMatrix M){
    int i,j,k=1;
    //输出矩阵的每一行
    for(i=0;i<M.mu;i++){
        printf("\n");
        //输出矩阵的每一列
        for(j=0;j<M.nu;j++){
            //判断矩阵中是否有非 0 元存在
            if(k>M.tu){
                printf("%3d",0);
            }
            else{
                //如果对应位置为非 0 元,则输出
                if((i==M.data[k].i) && (j == M.data[k].j)){
                    printf("%3d",M.data[k].e);
                    k++;
                }else{
                    //否输出 0
                    printf("%3d",0);
                }
            }
        }
    }
    printf("\n");
}
//稀疏矩阵的快速转置
TSMatrix quik(TSMatrix a){
	TSMatrix b;
	int k,q,col;			
	int num[20];						//序号(col)从1到b.tu
	int copt[20];						//序号(col)从1到b.tu
	b.mu=a.nu;
	b.nu=a.mu;
	b.tu=a.tu;
	if(b.tu)
	{	
		for(col=0;col<a.nu;col++)num[col]=0;
		for(k=1;k<=a.tu;k++)				//a中第col列非0元素的个数
		{
			col=a.data[k].j;
			++num[col];
		}
		copt[1]=1;
		for(col=2;col<=a.nu;col++)
		{copt[col]=copt[col-1]+num[col-1];}				//每列首元位置
		for(k=1;k<=a.tu;k++)				//建立新的三元组矩阵	
		{
			col=a.data[k].j;
			q=copt[col];
			b.data[q].i=a.data[k].j;
			b.data[q].j=a.data[k].i;
			b.data[q].e=a.data[k].e;
			copt[col]++;
		}
		for(col=1;col<=a.tu;col++)	printf("%d ",num[col]);
	}
	return b;
}
///////

int main(){
    int m,n,t;
    TSMatrix E,F;
    printf("input m,n,t:\n");
    scanf("%d%d%d",&m,&n,&t);
    E = tcreate(m,n,t);
    printt(E);
    F=quik(E);
    printt(F);
	system("pause");
}

 为什么结果不输出转置矩阵和num[]?

  • 写回答

4条回答 默认 最新

  • 正在学C++ 2021-04-21 20:24
    关注
    		for(col=1;col<=a.nu;col++)num[col]=0;//??????????????????
    
    		for(k=1;k<=a.tu;k++)				//a中第col列非0元素的个数
    
    		{
    
    			col=a.data[k].j;
    
    			++num[col+1];//????????????????????
    
    		}
    
    		copt[1]=1;
    
    		for(col=2;col<=a.nu;col++)
    
    		{copt[col]=copt[col-1]+num[col-1];}				//每列首元位置
    
    		for(k=1;k<=a.tu;k++)				//建立新的三元组矩阵	
    
    		{
    
    			col=a.data[k].j+1;//???????????????????????
    
    			q=copt[col];
    
    			b.data[q].i=a.data[k].j;
    
    			b.data[q].j=a.data[k].i;
    
    			b.data[q].e=a.data[k].e;
    
    			copt[col]++;
    
    		}
    
    		for(col=1;col<=a.nu;col++)	printf("%d ",num[col]);//????????????

    快速转置函数里的错误。主要是因为你的下标导致。你的i和j下标是从0开始,num和copt下标就有点乱,配合i和j就更乱了。所以干脆把num和copt下标都从1开始,也就是我打问号的那一行进行了改动。输出num那一行是你的for里面写错了。你可以试一试,我是分析出来的,没有跑程序。

    以后把下标统一全从1开始,会少很多误会和错误。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大