给出
1)1xn
向量a
,
2)nx1
向量b
,
3)nxn
矩阵X
,
问题是获得可以计算产品的迭代方法
a*{X*{X*{X*X}*X}*X}*b
尽可能快,其中括号{Y}
是一个用户定义的运算符,它返回一个矩阵,其所有对角元素都为零,其非对角元素等于矩阵Y
的元素
注意:
如果没有括号{}
运算符,如果想要计算乘积a*X*X*X*X*X*X*b
,我认为我们可以自然地将矩阵乘法运算符*
关联如下:
(((a*X)*X)*X)*(X*(X*(X*b)))
因此总时间复杂度为O(n^2)
。但是,当谈到
a*{X*{X*{X*X}*X}*X}*b
我不知道如何更改*
的关联类型。如果有人能给我一些提示,以显示在a*{X*{X*{X*X}*X}*X}*b
而不是O(n^2)
的同一时间内迭代计算O(n^3)
的可能性,我将不胜感激。
答案 0 :(得分:3)
我怀疑今天我们将通过以下减少提出o(matrix-multiplication(n))
- 时间算法。但是,可以将空间使用量设置为线性。
让{Y} = Y - diag(Y)
。我将考虑更简单的计算a*{X*{X*X}*X}*b'
问题。使用diag
的线性,我们写
{X*{X*X}*X} = {X*(X*X - diag(X*X))*X}
= X*(X*X - diag(X*X))*X - diag(X*(X*X - diag(X*X))*X)
= X*X*X*X - X*diag(X*X)*X - diag(X*X*X*X - X*diag(X*X)*X)
= X*X*X*X - X*diag(X*X)*X - diag(X*X*X*X) + diag(X*diag(X*X)*X).
现在依次考虑每个术语。第一项a*X*X*X*X*b' = ((a*X)*X)*(X*(X*b'))
可通过O(n^2)
运算来计算。第二个术语a*X*diag(X*X)*X*b' = (a*X)*diag(X*X)*(X*b')
也是如此。第四个术语也是a*diag(X*diag(X*X)*X)*b'
。
有问题的术语是第三个,a*diag(X*X*X*X)*b'
。由于其他三个可以使用O(n^2)
运算来计算,因此它在某种意义上与整个计算相同。
让j
成为全1矢量。然后是j*diag(X*X*X*X)*j' = tr(X^4)
。如果X
是图的邻接矩阵,则tr(X^4)
是(可能是简并的)4个循环的数量。假设无向简单图,简并4周期的数量由度序列的简单函数给出。 state of the art in cycle counting似乎并不比矩阵乘法更好。