看到矩阵第一联想是二维数组。用二维数组来存放此矩阵中的元素比如:int text[][5] = { {0,5,6,0,4},{0,0,0,0,0},{1,0,0,0,0},{1,0,0,0,0},{0,2,0,0,1}};
这行×列的方法,对于稀疏矩阵的存储与表示来说,功能没问题只是空间上开销的确有点奢侈。
如果我们只存储稀疏矩阵中的仅有的几个元素,可以节省一部分内存空间,所以可以舍弃二维数组的存储方式改为采用线性表存储;同时注意线性表存储的不只是元素本身的数字value,还要有此元素的行列值rows和cols来达到明确矩阵形态+定位的目的。三个属性,三元组的思想;
要想扫描一次 a 就能得到 b,必须每次扫描到一个三元组就直接将其放到 b 中相应的位置上,因此,需要知道 a 中的元素在 b 中的存储位置,这就要预先确定矩阵 A 的每一列的第一个非 0 元素在 b 中相应的位置。为此,需要附设两个数组,colsize和rowNext,分别用于存储矩阵 A 中每一列的非 0 元素个数和矩阵 A 中每一列第 1 个非0 元素在 b 中的存储位置。
rowNext[i]转置矩阵第i行首个非0元素在b中的索引这句话的理解:b是转置以后的矩阵的线性表,以上图为例,比如说6放在索引为0的位置上,5就放在索引为2的位置上,因为6和5中间有个4,以此类推
上图中colSize[1:8]=[0,2,1,2,1,1,1,1] rowNext[1:8]=[0,0,2,3,5,6,7,8]
显然,有如下的公式成立:
rowNext[1]=0;
rowNext[col] = rowNext[col - 1] + colsize[col -1],col 取大于等于 1 且小于 n 的数
template <class T>
void sMatrix <T> :: transpose(sMatrix<T> &b){
//转置方法代码实现
//b是传进来的待转置矩阵
//设置转置后的矩阵的特征
b.co