矩阵转置的快速转置

来源:互联网 发布:杭州行知中学校园网 编辑:程序博客网 时间:2024/05/17 21:43
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 100                  //最多非0元素的个数
#define MAXR 100                        //rpos所能处理的最大行数
#define MAXC 100                    //系数矩阵相乘时,保留临时列结果的数组temp[MAXC]
typedef struct NODE{               //定义稀疏矩阵结点
    int i;
    int j;
    int data;
} Node;
typedef struct MATRIX{          //定义稀疏矩阵(可以快速访问)
    int mu, nu, tu;
    Node matrix[MAXSIZE+1];
} Matrix;

//构建稀疏矩阵
int CreatSMatrix( Matrix *M )
{
    int temp, i,j;
    printf("输入矩阵行列数:");
    scanf("%d %d", &M->mu, &M->nu);
    M->tu = 0;
    printf("输入矩阵:\n");
    for( i = 1; i <= M->mu; i++)
    {
            for( j = 1; j <= M->nu; j++)
        {
            scanf("%d",&temp );
            if( temp )
            {      //非0值保存
                M->matrix[M->tu+1].i = i;
                M->matrix[M->tu+1].j = j;
                M->matrix[M->tu+1].data = temp;
                M->tu++;
            }
        }
    }
    return OK;
}


int Print( Matrix *M)
{
    int i;
    if(M->tu==0)
    {
        printf("空矩阵\n\n");
        return ERROR;
    }
  printf("i\tj\tdata\n");
    for( i=1; i<=M->tu; i++ )
        printf("%d\t%d\t%d\n", M->matrix[i].i,M->matrix[i].j,M->matrix[i].data);
    return OK;
}

int FastTranspose(Matrix M,Matrix *T)
{
    int col,t,p,q;
    int num[MAXSIZE],cpot[MAXSIZE];
    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;
        for(t = 1; t <= M.tu; ++t)
            ++num[M.matrix[t].j];
        cpot[1] = 1;
        for(col = 2; col <= M.nu; ++col)
            cpot[col] = cpot[col - 1] + num[col - 1];
        for(p = 1; p <= M.tu; ++p)
        {
            col = M.matrix[p].j;
            q = cpot[col];
            T->matrix[q].i = M.matrix[p].j;
            T->matrix[q].j = M.matrix[p].i;
            T->matrix[q].data = M.matrix[p].data;
            ++cpot[col];
        }
    }
    return OK;
}


int main()
{
     Matrix M,N,T;
     CreatSMatrix(&M);
     Print(&M);
     FastTranspose(M,&T);
     printf("%d %d %d",T.mu,T.nu,T.tu);
     Print(&T);
}


/*
int TransposeMartix(Matrix M,Matrix *T)
{
    int col,q,p;
    T->mu = M.nu;
    T->nu = M.mu;
    T->tu = M.tu;
    if(T->tu)
    {
        q = 1;
        for(col = 1; col <= M.nu; ++col)
            for(p = 1; p <= M.tu; ++p)
                if(M.matrix[p].j == col)
        {
            T->matrix[q].i = M.matrix[p].j;
            T->matrix[q].j = M.matrix[p].i;
            T->matrix[q].data = M.matrix[p].data;
            ++q;
        }
    }
    return OK;
}
*/

0 0
原创粉丝点击