0

我在每一轮递归中求解两个方程:

X = A - inv(B) * Y * inv(B),X = X + A' * inv(B) * A,

我这样解决问题:

C = inv(B) Y <=> BC = Y,求解 C. D = C inv(B) <=> DB = C <=> B'D' = C',求解 D'

E = inv(B)*A <=> BE = A,求解 E。

所有矩阵都会随着时间而变化,所以我必须在每次递归时再次执行此操作(或反转)。N 通常约为 1-10,可能更多,但通常是这样的。B 是正定的,所以我可以在因式分解中使用 cholesky,然后求解多个右手边的方程。

这比仅仅反转 B 然后用它进行矩阵乘法要慢得多还是快得多?一个反演与求解三个线性方程组(还有另一个方程)加上一些转置。我认为它至少在数值上比反转更稳定?

谢谢。

4

1 回答 1

1

首先,让我们假设你所有的矩阵都是 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+,否则我认为这并不重要。

于 2009-06-03T00:22:12.207 回答