Cholesky 分解有两种不同的形式:
A = M * ctranspose (M)
和 LDL 形式
A = L * D * ctranspose (L)
其中 ctranspose 是复杂的转置。
我想知道每种形式的浮点运算数。维基百科引用了一篇论文Matrix Inversion Using Cholesky Decomposition说
当有效实施时,LDL 分解的复杂性与 Cholesky 分解相同(原文如此)。
论文称 Cholesky 分解需要n^3/6 + O(n^2)
运算。然而,维基百科说浮点运算的数量是n^3/3
,我自己的计算也得到了第一种形式。它基本上归结为三角形数的总和,即:
n*(n+1)*(n+2)/6.
这就是我认为论文得到的地方n^3/6
。但是对于第一种形式,最里面的三重和中的项a[i][k]*a[j][k]
基本上是一个点积。总和是 2*n 浮点运算。所以浮动指针操作应该是n^3/3 + O(n^2)
. 如果您查看 LDL 表格,最里面的总和是a[i][k]*a[j][k]*d[k]
。那是 3*n 浮动指针操作(2 次乘法和 1 次加法)。所以浮点运算应该是n^3/2 + O(n^2)
.
换句话说,LDL 形式需要多 50% 的浮点运算。 我对么? 我认为这篇论文是错误的(尽管他们没有定义手术的含义)。这很重要,因为我正在实现基于 LDL 形式的改进形式的 Choleksy 分解,并且我想估计我的算法的效率。
也许这个问题更适合https://math.stackexchange.com/