怎么用三元组实现矩阵的相乘。。求救
//三元组表类型定义
{
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。。可是怎么实现相乘呢,算法没一点思路,那位大侠给点提示。
!!谢过
[解决办法]
http://www.cppblog.com/goal00001111/archive/2010/05/07/114721.html
研究一下。
[解决办法]
//求稀疏矩阵乘积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;}