矩阵的快速转置算法

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define MAXSIZE 100

typedef struct{
    int i,j;
    int data;
}triple;

typedef struct{
    triple data[MAXSIZE];//储存非0元素三元组
    int len; 
    int n,m;
}TSMatrix;
int flag=0;

void createtriple(TSMatrix &T,int m,int n,int max)//创建矩阵 
{
    max = (rand()%20)+(rand()%20)*max;
    srand((unsigned)time(NULL));
    int i,j,value;
    T.len=0;
    T.m=m;
    T.n=n;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            value = rand() % max;
            if(value>20)
                value=0;
            if(value!=0)//不为0储存到三元组表中
            {
                T.data[T.len].i = i;
                T.data[T.len].j = j;
                T.data[T.len++].data = value;
            }
        }
    }
}

void Print(TSMatrix T)//输出三元组表 
{
    int i=0;
    printf("三元组表对应的i j data分别为:\n");
    printf("i j data\n");
    for(i=0;i<T.len;i++)
        printf("%d %d %d\n",T.data[i].i,T.data[i].j,T.data[i].data);
}

void print(TSMatrix M,int m,int n)//输出矩阵
{
    int i,j;
    int T[m][n];
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
            T[i][j]=0;
    }
    for(i=0;i<M.len;i++)
    {
        T[M.data[i].i][M.data[i].j]+=M.data[i].data;
    }
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            if(j!=n-1)
            printf("%d ",T[i][j]);
            else
            printf("%d\n",T[i][j]);
        }
    }
} 

void quicktrans(TSMatrix &T)//快速转置
{
    int i,j; 
    TSMatrix M;
    M.m=T.n;//转置行列属性 
    M.n=T.m;
    M.len=T.len;
    int nonzero[T.n+1]={0};//记录每列非零元个数
    for(i=0;i<T.len;i++)
        nonzero[T.data[i].j]++;
    int cpot[T.n+1];
    cpot[0]=0;
    for(i=1;i<T.len;i++)
        cpot[i]=cpot[i-1]+nonzero[i-1];
    for(i=0;i<T.len;i++)
    {
        M.data[cpot[T.data[i].j]].i=T.data[i].j;
        M.data[cpot[T.data[i].j]].j=T.data[i].i;
        M.data[cpot[T.data[i].j]].data=T.data[i].data;
        cpot[T.data[i].j]++;
    }
    T=M;
}


int main()
{
    TSMatrix A;
    int m,n,max;
    printf("请输入矩阵的行和列(m和n):\n");
    scanf("%d %d",&m,&n);
    if(m<0 || n<0)
    {
        printf("你输入的值有误");
        exit(0);
    }
    printf("限制矩阵最大值(输入一个合适数字):\n");
    scanf("%d",&max);
    createtriple(A,m,n,max);//创建矩阵A 
    printf("矩阵A为:\n");
    print(A,m,n);//打印矩阵A 
    Print(A);//打印三元组A 
    quicktrans(A);//转置三元组A 
    printf("转置后A的三元组表:\n");
    Print(A);//打印转置后A
    printf("转置后A的矩阵为:\n");
    print(A,m,n);
}

输入:

输出:

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值