Include dependency graph for AbstractLinAlgPack_rank_2_chol_update.hpp:
This graph shows which files directly or indirectly include this file:
Go to the source code of this file.
|void||rank_2_chol_update (const value_type a, DVectorSlice *u, const DVectorSlice &v, DVectorSlice *w, DMatrixSliceTriEle *R, BLAS_Cpp::Transp R_trans)|
|Update the cholesky factor of symmetric positive definite matrix for a rank-2 update. |
Update the cholesky factor of symmetric positive definite matrix for a rank-2 update.
This function updates and an upper or lower triangular cholesky factor in O(n^2) flops. The basic idea is that the original symmetric positive definite matrix
is subjected to a rank-2 update. This rank-2 update to B must be expressed in the form
B = op(R')*op(R)
The basic approach is to introduce an othogonal matrix Q such that
B_new = J'*J where: J = (op(R) + a*u*v')
is triangular. In other words (with I = Q'*Q)
Q*(op(R) + a*u*v') -> op(R_new)
This algorithm is based on Algorithm A3.4.1a in Dennis and Schnabel. However, it has been extended in the sense that it handles upper and lower along with transposed and nontransposed factors. It does not touch any of the elements of R outside of the designated triangular region and returns the rotations used with no extra storage space needed. This is a much nicer function than any other one that I have seen in the public domain.
B_new = (op(R') + a*v*u')*Q'*Q*(op(R) + a*u*v') = op(R_new')*op(R_new)
It is guarrenteed that after this function finishes that the diagonal of R_new will be positive.