矩阵的快速转置

头文件

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW 0
typedef int ElemType; 
typedef int Status;

结构体

typedef struct {
    int i,j ;    //非零元的行和列
    ElemType e ;    //非零元的值
} Triple;   //三元组

typedef struct {
    Triple *data;    //非零元三元组表。0号单元未用
    int mu ,nu ,tu ;    //矩阵的行数、列数和非零元的个数
} TSMatrix ; //三元组顺序表

//num[j]统计矩阵A的a.data中第j列非零元素的个数
//cpos[j]表示矩阵A的a.data中第j列的第一个非零元在b.data中的起始位置
//矩阵A中第j列的起始位置等于第j-1列的起始位置加上第j-1的非零元的个数

矩阵的快速转置

Status FastTransposeSMatrix(TSMatrix M,TSMatrix &T){
    //采用三元组表存储表示,求稀疏矩阵M的转置矩阵T
    int j, q,k,p;
    int *num ,*cpos;
    T.mu = M.nu; T.nu=M.mu; T.tu=M.tu;
    if(T.tu!=0){
        T.data = (Triple *)malloc((T.tu+1) * sizeof(Triple));
        num = (int *)malloc((M.tu +1)*sizeof(int));
        cpos = (int *)malloc((M.tu +1)*sizeof(int)); 
        if(NULL==T.data || NULL==num || NULL==cpos)
            return OVERFLOW;
        for(j=1;j<=M.nu;++j)
            num[j]=0;
        for ( k = 1; k <= M.tu; ++k)    //求M中每一列所含非零元的个数
            ++num[M.data[k].j];
            //M.data[k].j代表原三元组的第k组数据的列在第几列
        cpos[1]=1;
        for(j = 2; j<= M.nu; ++j)   //求每一列的第一个非零元在b.data中的序号
            cpos[j]= cpos[j-1] + num[j-1];
        for(p=1; p<=M.tu; ++p){    //转置矩阵元素
            j=M.data[p].j;  //j等于M中第p组的列
            q=cpos[j];  //q等于M中第p组的数据在T中的位置
            T.data[q].i = M.data[p].j;  //T中第q组的行等于M中的第p组的列
            T.data[q].j = M.data[p].i;  //T中第q组的列等于M中的第p组的行
            T.data[q].e = M.data[p].e;
            //如过一列中有多组数据就需要用上下一行操作
            ++cpos[j];  //更新为第j列下一个非零元的位置
        }
    }
    free(num);
    free(cpos);
    return OK;
}

创建稀疏矩阵

//这个创建粗糙无比,只是单纯为了创建一个出来验证结果而已
Status CreateSMatrix(TSMatrix &M){
	M.mu=4;
	M.nu=8;
	M.tu=4;
	M.data=(Triple *)malloc((M.tu+1) * sizeof(Triple));
	M.data[1].i=1;
	M.data[1].j=6;
	M.data[1].e=2;
	M.data[2].i=1;
	M.data[2].j=7;
	M.data[2].e=3;
	M.data[3].i=2;
	M.data[3].j=1;
	M.data[3].e=5;
	M.data[4].i=3;
	M.data[4].j=6;
	M.data[4].e=9;
	return OK;
}

输出稀疏矩阵

void PrintSMatrix(TSMatrix M){
	for(int i=1;i<=M.tu;i++){
		printf("%d ",M.data[i].i);
		printf("%d ",M.data[i].j);
		printf("%d ",M.data[i].e);
		printf("\n");
	}
}

main函数

int main (){
	TSMatrix M,T;
	CreateSMatrix(M);
	printf("稀疏矩阵:\n"); 
	PrintSMatrix(M);
	FastTransposeSMatrix(M,T);
	printf("转置矩阵:\n");
	PrintSMatrix(T);
	return 0;
}

结果
在这里插入图片描述

发布了12 篇原创文章 · 获赞 2 · 访问量 235

猜你喜欢

转载自blog.csdn.net/m0_46140702/article/details/103828544