c语言三元组矩阵乘法,三元组稀疏矩阵的乘法

ca56232b3bbedf9a539d07f37fffb99a.gif

3144d8b7615c79d9f638db40d5689d26.gif

a218af6549b45ee526caf607ebff1358.gif

0f8df0e29816ae721419de940fb833d1.gif

三元组稀疏矩阵的乘法

#include

#include

#define MAXSIZE 12500

typedef struct

{

int i,j;

int e;

} Triple;

typedef struct

{

Triple data[MAXSIZE+1];

int mu,nu,tu;

} TSMatrix;

int CreateSMatrix2(TSMatrix &A,TSMatrix &B)

{

int m,n,i,j,f,g,d,c,v,b;

i=1;j=1;

scanf("%d %d",&m,&n);

A.mu=m;

A.nu=n;

A.tu=0;

while(1)

{

scanf("%d %d %d",&f,&g,&d);

if(f==0&g==0&d==0)

{break;}

else

A.data[i].i=f;

A.data[i].j=g;

A.data[i].e=d;

A.tu++;

i++;

}

scanf("%d %d",&m,&n);

B.mu=m;

B.nu=n;

B.tu=0;

while(1)

{

scanf("%d %d %d",&c,&v,&b);

if(c==0&v==0&b==0)

{break;}

else

B.data[j].i=c;

B.data[j].j=v;

B.data[j].e=b;

B.tu++;

j++;

}

return 0;

}

int MultS(TSMatrix &A,TSMatrix &B,TSMatrix &C)

{ int k,p,crow,brow,q,ccol;

int num[MAXSIZE],pos[MAXSIZE],ctemp[MAXSIZE];

if (A.nu==B.mu)

{ for(k=1;k<=B.mu;k++)

num[k]=0;

for(k=1;k<=B.tu;k++)

num[B.data[k].i]++;

pos[1]=1;

for(k=2;k<=B.tu;k++)

pos[k]=pos[k-1]+num[k-1];

pos[1+B.tu]=pos[B.tu]+1;

C.mu=A.mu; C.nu=B.nu; C.tu=0; p=1;

while(p<=A.tu)

{crow=A.data[p].i;

for(k=1;k<=C.nu;k++)

ctemp[k]=0;

while (p<=A.tu&&A.data[p].i==crow)

{

brow=A.data[p].j;

for(q=pos[brow];q<=pos[brow+1]-1;q++)

{  ccol=B.data[q].j;

ctemp[ccol]=ctemp[ccol]+A.data[p].e*B.data[q].e;

}

p=p+1;

}

for(ccol=1;ccol<=B.nu;ccol++)

if(ctemp[ccol]!=0)

{ C.tu=C.tu+1;

C.data[C.tu].i=crow;

C.data[C.tu].j=ccol;

C.data[C.tu].e=ctemp[ccol];

}

}

}else printf("these two arrat can't Multiplicate");return 0;

}

int main()

{

TSMatrix A,B,C;

int i;

CreateSMatrix2(A,B);

MultS(A,B,C);

for(i=1;1;i++)

{

printf("%d %d %d\n",C.data[i].i,C.data[i].j,C.data[i].e);

if(i>=C.tu)

break;

}

return 0;

}

这是一个稀疏矩阵乘法的代码 我有一个测试点有毛病。少输出一行。但其他测试点却正确我也不敢轻易改后面的参数

谁能帮帮我

2L贴上测试点错误信息

假设稀疏矩阵用三个数组来表示,分别为行下标数组row,列下标数组col和值数组val。代码如下: ```c void sparse_matrix_multiply(int rowA[], int colA[], int valA[], int nA, int mA, int kA, int rowB[], int colB[], int valB[], int nB, int mB, int kB) { if(mA != nB) { printf("Error: The number of columns of A is not equal to the number of rows of B.\n"); return; } // 初始化稀疏矩阵C int max_size = nA * mB; int rowC[max_size+1], colC[max_size], valC[max_size]; rowC[0] = 0; int i, j, k, p, q; for(i = 0; i < nA; i++) { int row_start = rowC[i]; for(j = 0; j < mB; j++) { int v = 0; for(p = rowA[i]; p < rowA[i+1]; p++) { // 在B矩阵中查找对应元素 for(q = rowB[colA[p]]; q < rowB[colA[p]+1]; q++) { if(colB[q] == j) { v += valA[p] * valB[q]; break; } } } if(v != 0) { colC[row_start] = j; valC[row_start] = v; row_start++; } } rowC[i+1] = row_start; } // 输出稀疏矩阵C for(i = 0; i < nA; i++) { for(j = 0; j < mB; j++) { int v = 0; for(k = rowC[i]; k < rowC[i+1]; k++) { if(colC[k] == j) { v = valC[k]; break; } } printf("%d ", v); } printf("\n"); } } ``` 其中,nA和mA分别表示矩阵A的行数和列数,kA表示A矩阵中的非零元素个数;nB和mB分别表示矩阵B的行数和列数,kB表示B矩阵中的非零元素个数。函数通过遍历稀疏矩阵A和B的非零元素,计算出稀疏矩阵C的每个元素,并将其存储在rowC、colC和valC数组中。最后再按照普通矩阵的方式输出稀疏矩阵C。注意,需要判断每个位置是否有非零元素,如果有则输出其值,否则输出0。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值