矩阵相乘(三元组)

  • 矩阵相乘

原理:
矩阵相乘(三元组)_第1张图片

矩阵相乘(三元组)_第2张图片

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
                }
            }
        }
    }
}

你可能感兴趣的:(矩阵相乘(三元组))