虽然不知道用矩阵表示图的操作有什么用(可能gpu计算的快一点吧),但是我还是挺喜欢这些意义不明的问题的。
图的邻接矩阵表示
在用矩阵表示图的操作之前,当然要先把图用矩阵表示出来。学过数据结构的同学应该都知道邻接矩阵,以一个有n个节点的有向图举例,它可以表示为一个nxn的矩阵A,如果节点i和节点j之间有边,则A中的元素a_{ij}=1,没有边则为0。
如果是无向图的话则还需要设置反向边a_{ji}=1。
复杂一点的话,如果是加权图则a_{ij}可以表示边的权重。如果是有重边的图a_{ij}也可以表示为节点i到j有多少条边。
虽然用a_{ij}记录一些权重或者什么其他的信息看起来很合理或者说很恰好它可以这么做,但是这样做的话感觉图就不纯粹了。如果我们只关注于图本身的结构的话,用a_{ij}表示边的数量就够了,我后面要做的操作也是以a_{ij}作为边数来进行的。
理论上a_{ij}表示权重也能进行部分操作,但是具体有没有意义我还没思考过,所以这也不会是这篇文章的内容。
矩阵加法
对应元素相加,这个可以说是非常直观了,就是两个图叠加起来。
矩阵的转置
矩阵交换行列,这个也很显然是边反向了。
向量乘法
向量的乘法是对应元素相乘再求和,矩阵和向量的乘法有,行向量乘矩阵、矩阵乘列向量两种。如果是01向量的话,则相当于提取矩阵的某些行或者某些列进行求和,如果向量的元素是实数的话也可以是加权求和。
矩阵的第i行的行向量,表示第i个节点到哪些节点有边。矩阵的第j列的列向量,表示有哪些节点到第j个节点有边。
一个典型例子,每个节点的入度=全1行向量乘矩阵,每个节点的出度=矩阵乘全1列向量。如果不是全一向量的话就相当于与特定几个节点相连的边数。
矩阵乘法
矩阵的乘法得到的矩阵的第i行第j个元素就是第一个矩阵的第i行乘第二个矩阵的第j列。
按照之前的解释,矩阵的乘法乘法在图里面相当于某种映射。第一个矩阵的第i行表示i到其他节点的边,第二个矩阵的第j列表示其他节点到j的边,如果i到x有边并且x到j也有边,那么i到j就有边,两者相乘求和的结果就是i到j的边的数量。
如果从图来理解的话可能是这样,对于每一个节点i,先按照图一的i的方式走一步,到达一阶邻居,然后再对所有一阶邻居按照图二查找能否一步走到j,如果能走到j则在i和j之间画一条边,这样得到一个新图。
矩阵的幂
矩阵乘法的特殊情况,矩阵的n次幂就是图的n阶邻居。
矩阵的初等变换之交换行列
交换行可以视为交换源节点,即把节点i为起点的边与节点j为起点的边交换。
交换行可以视为交换目标节点,即把节点i为终点的边与节点j为终点的边交换。
同时交换i行j行和i列j列,得到的图和原图同构,相当于只是交换了节点的编号。
矩阵的迹
矩阵的迹就是对角线元素之和,矩阵的对角线元素在图中表示的就是自环,直接对图的矩阵求迹就是看有多少个自环。
如果想判断图中有没有环可以计算\sum_{i=1}^{n}tr(A^i),看是否为0(感觉上可以,没有验证过)
结束
先草率的记录一下,可能也有误,以后如果有心情的话还可以补个图