首先,让我们假设你所有的矩阵都是 nx n 阶的。然后可以在 O(n^3/6) 操作中完成 cholesky 分解(对于较大的 n 值)。
求解 B*c(i) = y(i) 或 L*L'*c(i) = y(i) (Cholesky) 是 2*O(n^2/2) 或 O(n^2),但是求解 BC=Y 就是求解这些方程中的 n 个(因为 Y 是 nxn),所以我们总共有 O(n^3)。
求解 D' 显然与此类似,所以另一个 O(n^3)。
将 D' 转换为 D 大约是 O(n^2),但没有计算,只是交换数据(除了对角线元素当然是相同的)。
在第二个公式中求解 BE = A 中的 E 是再次反向替换 Cholesky 分解,所以 O(n^3)
A' * E 是 n^2 * (n mult and n-1 add) 这是 O(2*n^3 - n^2)
这总计为: O(n^3/6) + 3*O(n^3) + O(n^2) + O(2*n^3 - n^2) ~ O(31*n^3 /6) ~ O(5*n^3) (对于较大的 n 值)
请注意,我没有计算矩阵加法/减法,但这不相关,因为如果我们决定反转 B,它们将是相同的。出于同样的原因,我也跳过了 A 到 A'。
好的,那么反转矩阵的成本是多少?那么我们要求解矩阵方程:
B * inv(B) = I,这与求解 B * x(i) = e(i) for i=1..n 相同,其中 e(i) 是 I 中的基本单位向量。这通常是通过使用高斯消元将系统转换为三角形形式来完成,这需要大约 O(n^3/3) 次操作。当进行三角剖分时,需要 O(n^2/2) 次操作来解决它(向后替换)。但这必须做 n 次,这给了我们总共 O(n^4/3) + O(n^3/2) 次操作,所以你可以看到我们已经在边缘了。
但是,在知道 B 的 cholesky 分解为 O(n^3) 时计算 inv(B) (因为求解 L*L'*inv(B) = I 与求解 BE=A 相同)
所以我们有: O(n^3/6) (B的cholesky) + O(n^3) (用cholesky计算inv(B)) + 4*O(2n^3-n^2) (四个矩阵乘法)~ O(9*n^3) 好一点,但更糟。
所以我建议你保持目前的方法。但是您必须记住,这是针对较大的 n 值。除非 n 是 100+,否则我认为这并不重要。