基于LAPACK的对称正定矩阵求逆与平方根计算疑问
嘿,这个问题其实挺有意思的——先给你一个核心结论:你完全不需要额外跑dpotrf,甚至也没必要依赖dpotri的结果,因为你为了用dpotri,肯定已经完成了dpotrf的Cholesky分解,而那个分解结果就是构造A平方根的关键。
先理清楚LAPACK这两个子程序的依赖关系:dpotri必须以dpotrf输出的Cholesky因子(下三角L或上三角U)作为输入,它的作用是基于这个分解快速计算A逆矩阵的三角部分(因为A是对称正定的,逆矩阵也是对称的,所以只需要存三角部分)。所以你既然已经用了dpotri,说明你手里已经有了A的Cholesky分解结果——这才是求A平方根的最优起点。
用已有的Cholesky分解构造A的对称正定平方根
假设你用的是下三角Cholesky分解(UPLO='L',即A = L L^T):
- 把L拆成两部分:单位下三角矩阵
L_unit(对角元全为1,非对角元和L一致),加上对角矩阵D(对角元就是L的对角元素),也就是L = L_unit * D; - 计算
D_sqrt,即D的平方根矩阵(每个对角元单独开平方); - 构造矩阵
M = L_unit * D_sqrt; - 最后计算
S = M * M^T——这就是A的对称正定平方根,它满足S * S = A。
如果用的是上三角分解(UPLO='U',A = U^T U),逻辑完全一致:
- 把U拆成对角矩阵
D和单位上三角U_unit,即U = D * U_unit; - 计算
D_sqrt; - 构造
M = D_sqrt * U_unit; - 计算
S = M^T * M。
关于用dpotri结果求平方根的可行性
理论上是可行的,但完全没必要。dpotri输出的是A逆的三角部分,你要从这里得到A的平方根,得先构造A逆的平方根,再求它的逆——这多了好几步计算,效率远不如直接用你已经有的Cholesky分解结果。
举个简单的例子:假设dpotri输出的是A逆的下三角部分L_inv(满足A^{-1} = L_inv L_inv^T),那你得先对L_inv做类似的拆分和平方根构造得到A逆的平方根S_inv,再求S_inv的逆才能得到A的平方根。这不仅绕路,还会引入额外的矩阵求逆开销,完全是舍近求远。
最终建议
直接用你为了跑dpotri而得到的dpotrf分解结果来构造A的平方根,这是最直接、最高效的方式,不需要额外跑dpotrf,也不用碰dpotri的输出。
内容的提问来源于stack exchange,提问作者user402940

