矩阵之对称矩阵、稀疏矩阵逆置与加法
一、对称矩阵及压缩存储
由于对称矩阵对角线上下相同,因此我们可以采取压缩存储。
我们先了解一下压缩存储,对称矩阵存储时只需要存储上三角或下三角的数据,所以最多存储n*(n+1)/2个数据。
我们就知道了我们需要空间的大小。
代码如下:
测试结果如下:
二、稀疏矩阵
1、稀疏矩阵的压缩存储和还原
稀疏矩阵:矩阵中有效值的个数远小于无效值的个数,且这些数据的分布没有规律。
所以可以采用只存储非零元素(有效值)的方法来进行压缩存储。在进行压缩存储的时侯还要存储非零元素在矩阵中的位置。所以我们要使用
{row,col,value}三元组(Trituple)存储每一个有效数据,三元组按原矩阵中的位置,以行优先级先后顺序依次存放。
三元组如下:
我们需要一个容器存储每个节点的内容,代码如下:
为了测试方便我加了一个display()函数,是为了检测压缩存储是否正确,打印函数和输出运算符重载都是输出稀疏矩阵。
测试:
结果以下,有效元素以及整个稀疏矩阵。
三、矩阵的逆置
以上面稀疏矩阵为例,逆置就是将array[i][j]和array[j][i]的值交换。若我们直接将有效节点中的行列交换,输出的话,能得到我们想要的结果吗?
函数如下:
运行结果:
并没有成功,为什么呢?
因为首次存储时是按照行优先的存储顺序,若交换完依然按照行优先顺序进行输出,则不能全部输出。
我们可以将交换后的有效元素按照行的大小排序,再输出,如下(冒泡排序):
运行结果:
四、矩阵的加法
两个矩阵相加,即行列相对应的数相加。因此两个矩阵必须行和列分别相等。
因为我们只存储了有效元素,我们可以通过算出各个元素在原矩阵的偏移量,遍历两个矩阵,偏移量相等时相加;第一个矩阵元素偏移量小时,证明第二个矩阵没有对应元素。反之亦然。
代码如下:
测试结果如下: