performance - 计算以下产品的快速方法

标签 performance algorithm optimization matrix time-complexity

给定

1) 1xn 向量a,

2) 一个nx1向量b,

3) 一个nxn矩阵X,

问题是获得一个可以计算乘积的迭代方法

a*{X*{X*{X*X}*X}*X}*b

as fast as possible,其中括号{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)

最佳答案

我怀疑我们今天能否通过以下归约得出一个 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 为全一向量。然后 j*diag(X*X*X*X)*j' = tr(X^4)。如果 X 是图的邻接矩阵,则 tr(X^4) 是(可能退化的)4 循环的数量。假设一个无向简单图,退化 4 循环的数量由度数序列的一个简单函数给出。 state of the art in cycle counting似乎并不比矩阵乘法好。

关于performance - 计算以下产品的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25914378/

相关文章:

c++ - 在 C++ 中加速嵌套循环

algorithm - 设施位置 - 最小化为具有距离限制的客户提供服务的设施的算法

c++ - 代表四开棋盘游戏棋子的最佳方式

c++ - 简单的for()循环基准测试与任何循环绑定(bind)都花费相同的时间

performance - 我们应该进行哪些硬件改进来加速我们的构建机器?

algorithm - 是否可以在 O(n) 中构建 Fenwick 树?

algorithm - 从一系列可能有噪声、不一致或不完整的传递关系构建排名

c++ - 在 vector 中使用删除或调整大小哪个更快?

postgresql - 查看并清除 Postgres 缓存/缓冲区?

c# - 如何将大量数据写入文件?