Skip to contents

Provides functions that implements different types of updates of a Cholesky factor that includes rank-one update, single row/column deletion update and a block deletion update.

Usage

cholUpdateRankOne(A, v, alpha, beta, lower = TRUE)

cholUpdateDel(A, del.index, lower = TRUE)

cholUpdateDelBlock(A, del.start, del.end, lower = TRUE)

Arguments

A

an \(n\times n\) triangular matrix

v

an \(n\times 1\) matrix/vector

alpha

scalar; if not supplied, default is 1

beta

scalar; if not supplied, default is 1

lower

logical; if A is lower-triangular or not

del.index

an integer from 1 to \(n\) indicating the row/column to be deleted

del.start

an integer from 1 to \(n\) indicating the first row/column of a block to be deleted, must be at least 1 less than del.end

del.end

an integer from 1 to \(n\) indicating the last row/column of a block to be deleted, must be at least 1 more than del.start

Value

An \(m \times m\) lower-triangular matrix with \(m = n\) in case of cholUpdateRankOne(), \(m = n - 1\) in case of cholUpdateDel(), and, \(m = n - n_k\) in case of cholUpdateDelBlock() where \(n_k\) is the size of the block removed.

Details

Suppose \(B = AA^\top\) is a \(n \times n\) matrix with \(A\) being its lower-triangular Cholesky factor. Then rank-one update corresponds to finding the Cholesky factor of the matrix \(C = \alpha B + \beta vv^\top\) for some \(\alpha,\beta\in\mathbb{R}\) given \(A\) (see, Krause and Igel 2015). Similarly, single row/column deletion update corresponds to finding the Cholesky factor of the \((n-1)\times(n-1)\) matrix \(B_i\) which is obtained by removing the \(i\)-th row and column of \(B\), given \(A\) for some \(i - 1, \ldots, n\). Lastly, block deletion corresponds to finding the Cholesky factor of the \((n-n_k)\times(n-n_k)\) matrix \(B_{I}\) for a subset \(I\) of \(\{1, \ldots, n\}\) containing \(n_k\) consecutive indices, given the factor \(A\).

References

Oswin Krause and Christian Igel. 2015. "A More Efficient Rank-one Covariance Matrix Update for Evolution Strategies". In Proceedings of the 2015 ACM Conference on Foundations of Genetic Algorithms XIII (FOGA '15). Association for Computing Machinery, New York, NY, USA, 129-136. doi:10.1145/2725494.2725496 .

Author

Soumyakanti Pan span18@ucla.edu,
Sudipto Banerjee sudipto@ucla.edu

Examples

n <- 10
A <- matrix(rnorm(n^2), n, n)
A <- crossprod(A)
cholA <- chol(A)

## Rank-1 update
v <- 1:n
APlusvvT <- A + tcrossprod(v)
cholA1 <- t(chol(APlusvvT))
cholA2 <- cholUpdateRankOne(cholA, v, lower = FALSE)
print(all(abs(cholA1 - cholA2) < 1E-9))
#> [1] TRUE

## Single Row-deletion update
ind <- 2
A1 <- A[-ind, -ind]
cholA1 <- t(chol(A1))
cholA2 <- cholUpdateDel(cholA, del.index = ind, lower = FALSE)
print(all(abs(cholA1 - cholA2) < 1E-9))
#> [1] TRUE

## Block-deletion update
start_ind <- 2
end_ind <- 6
del_ind <- c(start_ind:end_ind)
A1 <- A[-del_ind, -del_ind]
cholA1 <- t(chol(A1))
cholA2 <- cholUpdateDelBlock(cholA, start_ind, end_ind, lower = FALSE)
print(all(abs(cholA1 - cholA2) < 1E-9))
#> [1] TRUE