首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

如何用三元组实现矩阵的相乘。

2012-04-09 
怎么用三元组实现矩阵的相乘。。求救//三元组表类型定义{int row,col,e//定义非零元素的行号、列号和元素值}

怎么用三元组实现矩阵的相乘。。求救
//三元组表类型定义
{
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
研究一下。
[解决办法]

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)* (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;} 

热点排行