怎么用三元组实现矩阵的相乘。。求救

shining_yyds 2011-06-06 04:16:09
//三元组表类型定义
{
int row,col,e;//定义非零元素的行号、列号和元素值
}Triple;
typedef struct
{
Triple data[maxsize+1];//储存非零元素
int m,n,len; //矩阵的行数、列数和非零元素的个数
}TSMatrix;
上面是我定义的三元组表。
相乘的函数定义为:void MultiplyTSMatrix(TSMatrix A,TSMatrix B TSMatrix *C)
A B矩阵非零元素都已输入完成,加法和转置运算ok。。可是怎么实现相乘呢,算法没一点思路,那位大侠给点提示。
!!谢过
...全文
508 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
shining_yyds 2011-06-10
  • 打赏
  • 举报
回复
三元组的矩阵乘法实在是没写出来,楼上算法不错,但我还是不会用。于是自己用二元数组重写了一下,思路是:把非零元素的值储存到二维数组中,其他的全部为零。在用两个数组相乘,不为零的进行储存到C中,然后输出。但是结果却不正确,应该是算法有问题。
void MultiMatrix(TSMatrix A,TSMatrix B,TSMatrix *C)
{
int data1[10][10],data2[10][10];
int i,j,p,q;
int sum=0;
if(A.m!=B.n)
cout<<"矩阵A的行数与矩阵B的列数不等,无法相乘!"<<endl;
else
{
for(i=1;i<=A.m;i++)
{
for(j=1;j<=B.m;j++)
{
for(int k=1;k<=A.len;k++)
{
if(i==A.data[k].row&&j==A.data[k].col)
{
data1[i][j]=A.data[k].e;

}
else data1[i][j]=0;
}

}
}
for(p=1;p<=B.m;p++)
{
for(q=1;q<=B.n;q++)
{
for(int r=1;r<=B.len;r++)
{
if(p==B.data[r].row&&q==B.data[r].col)
{
data2[p][q]=B.data[r].e;

}
else data2[p][q]=0;
}
}
}
for(i=1;i<=A.m;i++)
{
for(q=1;q<=B.n;q++)
{
for(j=1,p=1;j<=A.n,p<=B.m;j++,p++)
{
sum+=data1[i][j]*data2[p][q];
}
if(sum!=0)
{
int k=1;
C->data[k].e=sum;
C->data[k].row=i;
C->data[k].col=q;
k++;
sum=0;
}
}
}
}
ViewMatrix(*C);

}
迷惑中,求教!
KID_coder 2011-06-06
  • 打赏
  • 举报
回复

//函数结果状态码
#define OK 1
#define ERROR 0
#define OVERFLOW -1
//Status是函数的类型,其值是函数结果状态代码
typedef int Status;
// ----- 稀疏矩阵的三元组顺序表存储表示 -----
#define MAXSIZE 100 //假设非零元个数的最大值为100
#define MAXRC 100
typedef struct {
int i,j; //非零元的行下标和列下标
int e; //非零元的值
}Triple;
typedef struct {
Triple data[MAXSIZE + 1]; //非零元三元组表,data[0]未用
int rpos[MAXRC + 1]; //各行的第一个非零元的位置表
int mu, nu, tu; //矩阵的行数、列数和非零元个数
}RLSMatrix;

Status CreateSMatrix(RLSMatrix *M); //创建稀疏矩阵M,采用三元组存储
Status PrintSMatrix(RLSMatrix M); //输出稀疏矩阵M
Status AddSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix *Q); //求稀疏矩阵的和Q = M + N
Status MultSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix *Q); //求稀疏矩阵乘积Q = M ×N

不好意思。。。忘记贴结构体信息
shining_yyds 2011-06-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 kid_coder 的回复:]
C/C++ code

//求稀疏矩阵乘积Q = M ×N
Status MultSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix *Q)
{
int arow, brow, ccol, i, t, *ctemp, p, q, tp;//中间变量
ctemp = (int *) malloc(sizeof(int)*……
[/Quote]
Q->mu = M.mu, Q->nu = N.nu, Q->tu = 0;Q->tu表示什么意思啊?
KID_coder 2011-06-06
  • 打赏
  • 举报
回复

//求稀疏矩阵乘积Q = M ×N
Status MultSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix *Q)
{
int arow, brow, ccol, i, t, *ctemp, p, q, tp;//中间变量
ctemp = (int *) malloc(sizeof(int)* (N.nu+1));
//检查稀疏矩阵M的列数和N的行数是否对应相等
if(M.nu != N.mu) return ERROR;//稀疏矩阵M的列数和N的行数不相等,不能相乘,退出
//初始化矩阵Q
Q->mu = M.mu, Q->nu = N.nu, Q->tu = 0;
//相乘
if(M.tu * N.tu != 0)//Q是非零矩阵
{
for(arow = 1; arow <= M.mu; ++arow)//处理M的每一行
{
for(i = 0; i <= N.nu; ++i) ctemp[i] = 0;//当前行各元素累加器清零
Q->rpos[arow] = Q->tu + 1;
if(arow < M.mu) tp = M.rpos[arow + 1];
else tp = M.tu +1;
for(p = M.rpos[arow]; p < tp; ++p)//对当前行中的每一个非零元
{
brow = M.data[p].j; //找到对应元在N中的行号
if(brow < N.mu) t = N.rpos[brow+1];
else t = N.tu + 1;
for(q = N.rpos[brow]; q < t; ++q)
{
ccol = N.data[q].j; //乘积元素在Q中列号
ctemp[ccol] += M.data[p].e * N.data[q].e;
}
}//求得Q中第crow( = arow)行的非零元
for(ccol = 1; ccol <= Q->nu; ++ccol) //压缩存储该行非零元
{
if(ctemp[ccol])//非零元
{
if(++(Q->tu) > MAXSIZE) return ERROR;
Q->data[Q->tu].i = arow, Q->data[Q->tu].j = ccol, Q->data[Q->tu].e = ctemp[ccol];
}
}
}
}
return OK;
}

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧