我在每次递归回合中都有两个方程式解决:
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然后再进行矩阵乘法要慢得多还是快?一个逆转vs解决三个线性方程组(也有另一个方程)加上一些转置。我认为它至少在数值上比反转更稳定吗?
感谢。
答案 0 :(得分:1)
首先,让我们假设你的所有矩阵都是n x n阶。然后可以在O(n ^ 3/6)运算中完成胆甾醇分解(对于大的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再次向后取代胆甾烷因子分解,因此O(n ^ 3)
A'* E是n ^ 2 *(n mult和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,对于i = 1..n,求解B * x(i)= e(i),其中e(i)是I中的基本单位向量。这通常通过使用高斯消除将系统转换为三角形形式来完成,其需要大约O(n ^ 3/3)个操作。当进行三角测量时,需要O(n ^ 2/2)运算来解决它(向后替换)。但是这必须进行n次,这总共给了我们O(n ^ 4/3)+ O(n ^ 3/2)的运算,所以你可以看到我们已经超越了边缘。
然而,当知道B的胆甾分解时计算inv(B)是O(n ^ 3)(因为求解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+,否则无论如何我都认为不重要。