我需要计算矩阵的轨迹到3和4的幂,它需要尽可能快。
这里的矩阵是简单图的邻接矩阵,因此它是方形的,对称的,其条目总是1或0,对角元素总是0。
对于矩阵到2的幂的追踪,优化是微不足道的:
我在维基百科上发现的另一个想法是总结Hadamard产品的所有元素,即入门乘法,但我不知道如何将此方法扩展到3和4的幂。
请参阅http://en.wikipedia.org/wiki/Trace_(linear_algebra)#Properties
也许我只是盲目但我想不出一个简单的解决方案。
最后我需要一个C ++实现,但我认为这对问题并不重要。
提前感谢您的帮助。
答案 0 :(得分:3)
轨迹是特征值的总和,矩阵幂的特征值只是该幂的特征值。
也就是说,如果l_1,...,l_n是矩阵的特征值,则跟踪(M ^ p)= 1_1 ^ p + l_2 ^ p + ... + l_n ^ p。
根据您的矩阵,您可能想要计算特征值然后求和。如果你的矩阵具有低秩(或者可以很好地用低秩矩阵近似),你可以非常便宜地计算特征值(部分特征分解具有复杂度O(n * k ^ 2),其中k是秩)。
编辑:你在评论中提到它是1600x1600,在这种情况下找到所有的特征值应该没问题。这是您可以用于此http://code.google.com/p/redsvd/
的众多C ++代码之一答案 1 :(得分:1)
好的,我只是自己想出了这个。 我不知道的重要事情是:
如果A是有向或无向图G的邻接矩阵,那么矩阵An(即A的n个副本的矩阵乘积)具有一个有趣的解释:第i行和第j列中的条目给出了数字(有向或无向)从顶点i到顶点j的长度为n的行程。这意味着,例如,无向图G中的三角形数正好是A ^ 3的轨迹除以6。
(从http://en.wikipedia.org/wiki/Adjacency_matrix#Properties复制)
在处理稀疏图并使用邻接列表而不是矩阵时,基本上可以在O(n)中检索从节点i到i的所有n个节点的给定长度的路径数。
尽管如此,谢谢你的回答!