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

/*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 (krow)

t=rpot[k+1];

else

t=B->num+1;

for(q=rpot[k];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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
稀疏矩阵快速是一种优化算法,用于将稀疏矩阵的行和列互换,从而得到矩阵。下面是伪代码: status FastTransposeSMatrix(TSMatrix M, TSMatrix *T){ //采用三元组顺序表存储表示,求稀疏矩阵M的矩阵T int col,t,p; 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.data[t].j]; cpot=1; //求第col列中第一个非零元在b.data中的序号 for(col=2;col<=M.nu;++col) cpot[col]=cpot[col-1]+num[col-1]; for(p=1;p<=M.tu;++p) { col=M.data[p].j; q=cpot[col]; T->data[q].i=M.data[p].j; T->data[q].j=M.data[p].i; T->data[q].e=M.data[p].e; ++cpot[col]; }//for }//if return OK; } 矩阵乘法是一种常见的矩阵运算,用于计算两个矩阵的乘积。下面是矩阵乘法的伪代码: status MatrixMultiply(SMatrix A, SMatrix B, SMatrix *C){ //稀疏矩阵乘法,将矩阵A和B相乘,结果存储在矩阵C中 if(A.nu != B.mu) return ERROR; int i,j,k,p,q,t=0; int ctemp[MAXSIZE+1]; for(i=1;i<=A.mu;++i){ for(j=1;j<=B.nu;++j) ctemp[j]=0; C->rpos[i]=t+1; if(i<A.mu) p=A.rpos[i+1]; else p=A.tu+1; for(k=A.rpos[i];k<p;++k){ if(A.data[k].e==0) continue; if(B.rpos[A.data[k].j+1]==B.rpos[A.data[k].j]) continue; q=B.rpos[A.data[k].j+1]-1; for(t=B.rpos[A.data[k].j];t<=q;++t){ j=B.data[t].j; ctemp[j]+=A.data[k].e*B.data[t].e; }//for }//for for(j=1;j<=B.nu;++j){ if(ctemp[j]){ if(++t>C->tu) return ERROR; C->data[t].i=i; C->data[t].j=j; C->data[t].e=ctemp[j]; }//if }//for }//for C->rpos[A.mu+1]=C->tu+1; C->mu=A.mu; C->nu=B.nu; return OK; }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值