|TensorFlow 1 version||View source on GitHub|
LinearOperator with a rank
Compat aliases for migration
See Migration guide for more details.
tf.linalg.LinearOperatorLowRankUpdate( base_operator, u, diag_update=None, v=None, is_diag_update_positive=None, is_non_singular=None, is_self_adjoint=None, is_positive_definite=None, is_square=None, name='LinearOperatorLowRankUpdate' )
This operator acts like a [batch] matrix
A with shape
[B1,...,Bb, M, N] for some
b >= 0. The first
b indices index a
batch member. For every batch index
A[i1,...,ib, : :] is
M x N matrix.
A = L + U D V^H, where
L, is a LinearOperator representing [batch] M x N matrices U, is a [batch] M x K matrix. Typically K << M. D, is a [batch] K x K matrix. V, is a [batch] N x K matrix. Typically K << N. V^H is the Hermitian transpose (adjoint) of V.
M = N, determinants and solves are done using the matrix determinant
lemma and Woodbury identities, and thus require L and D to be non-singular.
Solves and determinants will be attempted unless the "is_non_singular" property of L and D is False.
In the event that L and D are positive-definite, and U = V, solves and determinants can be done using a Cholesky factorization.
# Create a 3 x 3 diagonal linear operator. diag_operator = LinearOperatorDiag( diag_update=[1., 2., 3.], is_non_singular=True, is_self_adjoint=True, is_positive_definite=True) # Perturb with a rank 2 perturbation operator = LinearOperatorLowRankUpdate( operator=diag_operator, u=[[1., 2.], [-1., 3.], [0., 0.]], diag_update=[11., 12.], v=[[1., 2.], [-1., 3.], [10., 10.]]) operator.shape ==> [3, 3] operator.log_abs_determinant() ==> scalar Tensor x = ... Shape [3, 4] Tensor operator.matmul(x) ==> Shape [3, 4] Tensor
This operator acts on [batch] matrix with compatible shape.
x is a batch matrix with compatible shape for
operator.shape = [B1,...,Bb] + [M, N], with b >= 0 x.shape = [B1,...,Bb] + [N, R], with R >= 0.
operator is a
LinearOperatorLowRankUpdate of shape
made from a rank
K update of
base_operator which performs
x.shape = [N, R] with
O(L_matmul*N*R) complexity (and similarly
determinant. Then, if
x.shape = [N, R],
O(L_matmul*N*R + K*N*R)
M = N,
O(L_matmul*N*R + N*K*R + K^2*R + K^3)
O(L_determinant + L_solve*N*K + K^2*N + K^3)
x have shape
[B1,...,Bb, M, N] and
[B1,...,Bb, N, R], every operation increases in complexity by
Matrix property hints
LinearOperator is initialized with boolean flags of the form
X = non_singular,
square. These have the following meaning:
is_X == True, callers should expect the operator to have the property
X. This is a promise that should be fulfilled, but is not a runtime assert. For example, finite floating point precision may result in these promises being violated.
is_X == False, callers should expect the operator to not have
is_X == None(the default), callers should have no expectation either way.