- 矩阵相乘
原理:
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
}
}
}
}
}