稀疏矩阵的快速转置和乘法运算源代码(非常详细)

来源:互联网 发布:python 列表变元组 编辑:程序博客网 时间:2024/06/08 06:21

/*sparseMatrix.h*/

#include "stdio.h"

#include "stdlib.h"
#define SIZE 100
typedef struct
{
int i,j,val;
}Trip;
typedef struct{
   Trip data[SIZE];
   int row,col,num;
}SMatrix;
void create(SMatrix *matrix)
{


int i, x, y, e;
printf("Please input the spare matrix's row and cow:\n");//提示输入行列数
scanf("%d %d", &matrix->row, &matrix->col);
printf("Please input the number of nonzero value:\n");//提示输入非零元素个数
scanf("%d", &matrix->num);
//开始创建三元组
printf("Please input the row and cow of nonzero:\n");
for (i = 1; i<=matrix->num; i++)
{
scanf("%d %d %d", &x, &y, &e);//输入非零元素的行,列,和非零值。
matrix->data[i].i=x;
matrix->data[i].j=y;
matrix->data[i].val=e;
    }
}
void Tranverse(SMatrix matrix,SMatrix* tran_res)
{//稀疏矩阵的转置,一个M*N的稀疏矩阵,转置为N*M的矩阵
int cnum[SIZE];//列非零元素的个数
int cpot[SIZE];//列的起始位置
int i,p;
for(i=0;i<=matrix.col;i++)
{ cnum[i]=0;
cpot[i]=1;
}
tran_res->col = matrix.row;//转置后的行数等于原来的列数
tran_res->row = matrix.col;//转置后的列数等于原来的行数
tran_res->num= matrix.num;//非零元素个数不变
for (i = 1; i <= matrix.num; i++)//计算每列的非零元素的个数
{
cnum[matrix.data[i].j]++;
}
for (i=1; i <= matrix.col; ++i)
{//计算每列的非零元素的起始位置
cpot[i] = cpot[i - 1] + cnum[i - 1];
}
//转置运算
for (i = 1; i <= matrix.num;++i)
{
p = cpot[matrix.data[i].j]++;//p为转置后该列在矩阵中的位置
tran_res->data[p].i=matrix.data[i].j;//行列互换
tran_res->data[p].j=matrix.data[i].i;
tran_res->data[p].val=matrix.data[i].val;
    }
}


void printMatrix(SMatrix matrix)
{
int i,j;
int arr[SIZE][SIZE];
for(i=0;i<=matrix.row;i++)
for(j=0;j<=matrix.col;j++)
arr[i][j]=0;
for (i = 1; i <= matrix.num; ++i) {
arr[matrix.data[i].i][matrix.data[i].j] = matrix.data[i].val;
}
printf("The spare matrix is:\n");
for (i = 1; i <= matrix.row; ++i)
{
for (j = 1; j <=matrix.col; ++j)
printf("%d ", arr[i][j]);
printf("\n");
}
}


SMatrix *MulSMatrix (SMatrix *A, SMatrix *B)
  {  SMatrix  *C; /* 乘积矩阵的指针 */
      int p,q,i,j,k,r,t; 
 int *temp;
      int *num,*rpot;
 temp=(int *)malloc(sizeof(int)*(B->col+1));
 num=(int *)malloc(sizeof(int)*(B->row+1));
 rpot=(int *)malloc(sizeof(int)*(B->row+1));
      if (A->col!=B->row)  return NULL; /*A的列与B的行不相等*/
      C=(SMatrix *)malloc(sizeof(SMatrix));  /*申请C矩阵的存储空间*/
      C->row=A->row; C->col=B->col; 
      if (A->num*B->num==0) 
 {   C->num=0; 
     return C;  
 } 
      for (i=1;i<= B->row;i++) 
 num[i]=0; 
      for(k=1;k<=B->num;k++)
      { 
 i= B->data[k].i;  num[i]++;  
 }  /*求矩阵B中每一行非零元素的个数*/
      rpot[1]=1;  /*求矩阵B中每一行第一个非零元素在B.data中的位置*/
      for (i=2;i<=B->row;i++) 
          rpot[i]= rpot[i-1]+num[i-1];
          r=0;
        p=1;
        for ( i= 1;i<=A->row; i++)
{
for (j=1;j<=B->col;j++) 
       temp[j]=0;
              while(A->data[p].i==i)
 {
 k=A->data[p].j; 
                  if (k<B->row)  
  t=rpot[k+1];
                  else  
  t=B->num+1;
for(q=rpot[k];q<t;q++)
{
j=B->data[q].j;
                    temp[j]+=A->data[p].val*B->data[q].val;
                 } /* B中第k行的每一个非零元素*/
                    p++; 
 } 
              for (j=1;j<=B->col;j++)  
                 if (temp[j]) 
                   {  
  r++;
      C->data[r].i=i;
  C->data[r].j=j;
  C->data[r].val=temp[j];
}
          } 
       C->num=r;  
  return C;
    }
#include "sparsematrix.h"
void main()
{
SMatrix M, N,Q,*P;
int i;
create(&M);
printMatrix(M);
Tranverse(M,&N);
printMatrix(N);
create(&Q);
P=MulSMatrix(&M,&Q);
    printMatrix(*P);
}
原创粉丝点击