矩阵相乘(三元组)

  • 矩阵相乘

原理:
示意图

示意图

void MultiMatrix(TSMatrix m1, TSMatrix m2, TSMatrix *m3)
{
    int arow, brow, ccol, p, q;
    float ctemp[100];

    //统计m1
    int num1[1000], cpot1[1000];
    for(p = 0; p < m1.tu; p++)           //初始化每一列的非零元的个数num
        num1[p] = 0, cpot1[p] = 0;       //该列第一个非零元在转置后矩阵T中的位置cpot
    for(p = 0; p < m1.tu; p++)           //统计每列的非零元个数
        num1[m1.data[p].i]++;
    for(p = 1; p <= m1.mu; p++)           //计算每列第一个非零元转置后的位置
        cpot1[p] = cpot1[p-1]+num1[p-1];
/*测试*/
//    for(p = 0; p <= m1.mu; p++)
//        cout << cpot1[p] << " ";
//    cout << endl;

    //统计m2
    int num2[1000], cpot2[1000];
    for(p = 0; p < m2.tu; p++)           //初始化每一列的非零元的个数num
        num2[p] = 0, cpot2[p] = 0;       //该列第一个非零元在转置后矩阵T中的位置cpot
    for(p = 0; p < m2.tu; p++)           //统计每列的非零元个数
        num2[m2.data[p].i]++;
    for(p = 1; p <= m2.mu; p++)           //计算每列第一个非零元转置后的位置
        cpot2[p] = cpot2[p-1]+num2[p-1];
/*测试*/
//    for(p = 0; p <= m2.mu; p++)
//        cout << cpot2[p] << " ";
//    cout << endl;

    m3->mu = m1.mu;
    m3->nu = m2.nu;
    m3->tu = 0;                 //初始化m3的元素个数为0

    if(m1.tu*m2.tu != 0)
    {
        for(arow = 0; arow < m1.mu; arow++)     //依次枚举每一行
        {
            memset(ctemp, 0, sizeof(ctemp));
            //遍历arow行所有元素
            for(p = cpot1[arow]; p < cpot1[arow+1]; p++)
            {
                brow = m1.data[p].j;
                //遍历m1.data[arow].j行的每一个元素
                for(q = cpot2[brow]; q < cpot2[brow+1]; q++)
                {
                    ccol = m2.data[q].j;
                    ctemp[ccol] += m1.data[p].elem*m2.data[q].elem;
/*测试*/
//                    cout << m1.data[p].elem << " " << m2.data[q].elem  << endl;
//                    cout << ctemp[ccol] << endl;
                }
            }
            //根据ctmep,将arow行对应的不同列赋值
            for(ccol = 0; ccol < m3->nu; ccol++)            
            {
                if(ctemp[ccol])
                {
                    m3->data[m3->tu].i = arow;
                    m3->data[m3->tu].j = ccol;
                    m3->data[m3->tu].elem = ctemp[ccol];
                    m3->tu++;          //m3的元素个数+1
                }
            }
        }
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值