}
}
以上主要设计思想为:
此功能由函数multi()实现。
当用户选择该功能,系统提示输入要进行相乘的两个矩阵的详细信息。
然后检测两者是否可以相乘,如果不能,则重新初始化第二个矩阵。
先对矩阵B进行逐行处理,先求得累计求和的中间结果(C的每一行),然后再压缩存储到c.data中去,最后得到结果。
第四章设计理论分析方法
4.1算法一:
矩阵转置
转置运算时一种最简单的矩阵运算,对于一个m*n的矩阵M,他的转置矩阵T是一个n*m的矩阵,且T(i,j)=M(j,i),1<=i<=n,1<=j<=m。
显然,一个稀疏矩阵的转置矩阵仍然是稀疏矩阵。
(1)将矩阵的行列值相互交换;
(2)将每个三元组中的i和j相互调换;(3)重排三元组之间的次序便可实现矩阵的转置。
一般矩阵转置算法为
for(col=1;col<=nu;++col)
for(row=1;row<=mu;++row)
T[col][row]=M[row][col];
按照a.data中三元组的次序进行转置,并将转置后的三元组置入b中恰中M表示矩阵Num[col]两个向量。
cpot和num当的位置。
在此,需要附设
第col列中非零元的个数,cpot[col]指示M中第col列的第一个非零元在b.data中的恰当位置。
cpot[1]=1
cpot[col]=cpot[col-1]+num[col-1]2<=col<=a.nu
这就是快速转置。
4.2算法二:
矩阵加法
稀疏矩阵使用三元组存储,则运算时只需考虑非零元的值即可。
两个矩阵相加
首先必须保证M.mu=N.mu&&M.nu=N.nu即同行同列的矩阵才能相加。
for(k=1;k<=M.tu;k++)
for(i=1;i<=N.tu;i++)
if(M.data[k].i==N.data[i].i&&
M.data[k].j==N.data[i].j)
Q.data[count].e=M.data[k].e+N.data[i].e;
flag[i]=true;
如果非零元位置一样就直接相加
if(i>N.tu)
Q.data[count].e=M.data[k].e;
如果没有找到与M非零元位置一样的元素就直接把M中的非零元赋值给矩阵Q。
for(k=1;k<=N.tu;k++)
if(!
flag[k])
Q.data[count].e=N.data[k].e;
如果N中的元素没有被查找,则直接把N中的非零元赋值给矩阵Q。
4.3算法三:
矩阵乘法
矩阵乘法采用“带行链接信息”的三元组存储。
经典算法如下:
for(i=1;i<=m1;++i)
for(j