|  TensorFlow 2 version |  View source on GitHub | 
Kronecker product between two LinearOperators.
Inherits From: LinearOperator
tf.linalg.LinearOperatorKronecker(
    operators, is_non_singular=None, is_self_adjoint=None,
    is_positive_definite=None, is_square=None, name=None
)
This operator composes one or more linear operators [op1,...,opJ],
building a new LinearOperator representing the Kronecker product:
op1 x op2 x .. opJ (we omit parentheses as the Kronecker product is
associative).
If opj has shape batch_shape_j + [M_j, N_j], then the composed operator
will have shape equal to broadcast_batch_shape + [prod M_j, prod N_j],
where the product is over all operators.
# Create a 4 x 4 linear operator composed of two 2 x 2 operators.
operator_1 = LinearOperatorFullMatrix([[1., 2.], [3., 4.]])
operator_2 = LinearOperatorFullMatrix([[1., 0.], [2., 1.]])
operator = LinearOperatorKronecker([operator_1, operator_2])
operator.to_dense()
==> [[1., 2., 0., 0.],
     [3., 4., 0., 0.],
     [2., 4., 1., 2.],
     [6., 8., 3., 4.]]
operator.shape
==> [4, 4]
operator.log_abs_determinant()
==> scalar Tensor
x = ... Shape [4, 2] Tensor
operator.matmul(x)
==> Shape [4, 2] Tensor
# Create a [2, 3] batch of 4 x 5 linear operators.
matrix_45 = tf.random.normal(shape=[2, 3, 4, 5])
operator_45 = LinearOperatorFullMatrix(matrix)
# Create a [2, 3] batch of 5 x 6 linear operators.
matrix_56 = tf.random.normal(shape=[2, 3, 5, 6])
operator_56 = LinearOperatorFullMatrix(matrix_56)
# Compose to create a [2, 3] batch of 20 x 30 operators.
operator_large = LinearOperatorKronecker([operator_45, operator_56])
# Create a shape [2, 3, 20, 2] vector.
x = tf.random.normal(shape=[2, 3, 6, 2])
operator_large.matmul(x)
==> Shape [2, 3, 30, 2] Tensor
Performance
The performance of LinearOperatorKronecker on any operation is equal to
the sum of the individual operators' operations.
Matrix property hints
This LinearOperator is initialized with boolean flags of the form is_X,
for X = non_singular, self_adjoint, positive_definite, square.
These have the following meaning:
- If is_X == True, callers should expect the operator to have the propertyX. 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.
- If is_X == False, callers should expect the operator to not haveX.
- If is_X == None(the default), callers should have no expectation either way.
| Args | |
|---|---|
| operators | Iterable of LinearOperatorobjects, each with
the samedtypeand composable shape, representing the Kronecker
factors. | 
| is_non_singular | Expect that this operator is non-singular. | 
| is_self_adjoint | Expect that this operator is equal to its hermitian transpose. | 
| is_positive_definite | Expect that this operator is positive definite,
meaning the quadratic form x^H A xhas positive real part for all
nonzerox.  Note that we do not require the operator to be
self-adjoint to be positive-definite.  See:
https://en.wikipedia.org/wiki/Positive-definite_matrix\Extension_for_non_symmetric_matrices | 
| is_square | Expect that this operator acts like square [batch] matrices. | 
| name | A name for this LinearOperator.  Default is the individual
operators names joined with_x_. | 
| Raises | |
|---|---|
| TypeError | If all operators do not have the same dtype. | 
| ValueError | If operatorsis empty. | 
| Attributes | |
|---|---|
| H | Returns the adjoint of the current LinearOperator.Given  | 
| batch_shape | TensorShapeof batch dimensions of thisLinearOperator.If this operator acts like the batch matrix  | 
| domain_dimension | Dimension (in the sense of vector spaces) of the domain of this operator. If this operator acts like the batch matrix  | 
| dtype | The DTypeofTensors handled by thisLinearOperator. | 
| graph_parents | List of graph dependencies of this LinearOperator. | 
| is_non_singular | |
| is_positive_definite | |
| is_self_adjoint | |
| is_square | Return True/Falsedepending on if this operator is square. | 
| operators | |
| range_dimension | Dimension (in the sense of vector spaces) of the range of this operator. If this operator acts like the batch matrix  | 
| shape | TensorShapeof thisLinearOperator.If this operator acts like the batch matrix  | 
| tensor_rank | Rank (in the sense of tensors) of matrix corresponding to this operator. If this operator acts like the batch matrix  | 
Methods
add_to_tensor
add_to_tensor(
    x, name='add_to_tensor'
)
Add matrix represented by this operator to x.  Equivalent to A + x.
| Args | |
|---|---|
| x | Tensorwith samedtypeand shape broadcastable toself.shape. | 
| name | A name to give this Op. | 
| Returns | |
|---|---|
| A Tensorwith broadcast shape and samedtypeasself. | 
adjoint
adjoint(
    name='adjoint'
)
Returns the adjoint of the current LinearOperator.
Given A representing this LinearOperator, return A*.
Note that calling self.adjoint() and self.H are equivalent.
| Args | |
|---|---|
| name | A name for this Op. | 
| Returns | |
|---|---|
| LinearOperatorwhich represents the adjoint of thisLinearOperator. | 
assert_non_singular
assert_non_singular(
    name='assert_non_singular'
)
Returns an Op that asserts this operator is non singular.
This operator is considered non-singular if
ConditionNumber < max{100, range_dimension, domain_dimension} * eps,
eps := np.finfo(self.dtype.as_numpy_dtype).eps
| Args | |
|---|---|
| name | A string name to prepend to created ops. | 
| Returns | |
|---|---|
| An AssertOp, that, when run, will raise anInvalidArgumentErrorif
the operator is singular. | 
assert_positive_definite
assert_positive_definite(
    name='assert_positive_definite'
)
Returns an Op that asserts this operator is positive definite.
Here, positive definite means that the quadratic form x^H A x has positive
real part for all nonzero x.  Note that we do not require the operator to
be self-adjoint to be positive definite.
| Args | |
|---|---|
| name | A name to give this Op. | 
| Returns | |
|---|---|
| An AssertOp, that, when run, will raise anInvalidArgumentErrorif
the operator is not positive definite. | 
assert_self_adjoint
assert_self_adjoint(
    name='assert_self_adjoint'
)
Returns an Op that asserts this operator is self-adjoint.
Here we check that this operator is exactly equal to its hermitian transpose.
| Args | |
|---|---|
| name | A string name to prepend to created ops. | 
| Returns | |
|---|---|
| An AssertOp, that, when run, will raise anInvalidArgumentErrorif
the operator is not self-adjoint. | 
batch_shape_tensor
batch_shape_tensor(
    name='batch_shape_tensor'
)
Shape of batch dimensions of this operator, determined at runtime.
If this operator acts like the batch matrix A with
A.shape = [B1,...,Bb, M, N], then this returns a Tensor holding
[B1,...,Bb].
| Args | |
|---|---|
| name | A name for this Op. | 
| Returns | |
|---|---|
| int32Tensor | 
cholesky
cholesky(
    name='cholesky'
)
Returns a Cholesky factor as a LinearOperator.
Given A representing this LinearOperator, if A is positive definite
self-adjoint, return L, where A = L L^T, i.e. the cholesky
decomposition.
| Args | |
|---|---|
| name | A name for this Op. | 
| Returns | |
|---|---|
| LinearOperatorwhich represents the lower triangular matrix
in the Cholesky decomposition. | 
| Raises | |
|---|---|
| ValueError | When the LinearOperatoris not hinted to be positive
definite and self adjoint. | 
determinant
determinant(
    name='det'
)
Determinant for every batch member.
| Args | |
|---|---|
| name | A name for this Op. | 
| Returns | |
|---|---|
| Tensorwith shapeself.batch_shapeand samedtypeasself. | 
| Raises | |
|---|---|
| NotImplementedError | If self.is_squareisFalse. | 
diag_part
diag_part(
    name='diag_part'
)
Efficiently get the [batch] diagonal part of this operator.
If this operator has shape [B1,...,Bb, M, N], this returns a
Tensor diagonal, of shape [B1,...,Bb, min(M, N)], where
diagonal[b1,...,bb, i] = self.to_dense()[b1,...,bb, i, i].
my_operator = LinearOperatorDiag([1., 2.])
# Efficiently get the diagonal
my_operator.diag_part()
==> [1., 2.]
# Equivalent, but inefficient method
tf.linalg.diag_part(my_operator.to_dense())
==> [1., 2.]
| Args | |
|---|---|
| name | A name for this Op. | 
| Returns | |
|---|---|
| diag_part | A Tensorof samedtypeas self. | 
domain_dimension_tensor
domain_dimension_tensor(
    name='domain_dimension_tensor'
)
Dimension (in the sense of vector spaces) of the domain of this operator.
Determined at runtime.
If this operator acts like the batch matrix A with
A.shape = [B1,...,Bb, M, N], then this returns N.
| Args | |
|---|---|
| name | A name for this Op. | 
| Returns | |
|---|---|
| int32Tensor | 
inverse
inverse(
    name='inverse'
)
Returns the Inverse of this LinearOperator.
Given A representing this LinearOperator, return a LinearOperator
representing A^-1.
| Args | |
|---|---|
| name | A name scope to use for ops added by this method. | 
| Returns | |
|---|---|
| LinearOperatorrepresenting inverse of this matrix. | 
| Raises | |
|---|---|
| ValueError | When the LinearOperatoris not hinted to benon_singular. | 
log_abs_determinant
log_abs_determinant(
    name='log_abs_det'
)
Log absolute value of determinant for every batch member.
| Args | |
|---|---|
| name | A name for this Op. | 
| Returns | |
|---|---|
| Tensorwith shapeself.batch_shapeand samedtypeasself. | 
| Raises | |
|---|---|
| NotImplementedError | If self.is_squareisFalse. | 
matmul
matmul(
    x, adjoint=False, adjoint_arg=False, name='matmul'
)
Transform [batch] matrix x with left multiplication:  x --> Ax.
# Make an operator acting like batch matrix A.  Assume A.shape = [..., M, N]
operator = LinearOperator(...)
operator.shape = [..., M, N]
X = ... # shape [..., N, R], batch matrix, R > 0.
Y = operator.matmul(X)
Y.shape
==> [..., M, R]
Y[..., :, r] = sum_j A[..., :, j] X[j, r]
| Args | |
|---|---|
| x | LinearOperatororTensorwith compatible shape and samedtypeasself. See class docstring for definition of compatibility. | 
| adjoint | Python bool.  IfTrue, left multiply by the adjoint:A^H x. | 
| adjoint_arg | Python bool.  IfTrue, computeA x^Hwherex^His
the hermitian transpose (transposition and complex conjugation). | 
| name | A name for this Op. | 
| Returns | |
|---|---|
| A LinearOperatororTensorwith shape[..., M, R]and samedtypeasself. | 
matvec
matvec(
    x, adjoint=False, name='matvec'
)
Transform [batch] vector x with left multiplication:  x --> Ax.
# Make an operator acting like batch matric A.  Assume A.shape = [..., M, N]
operator = LinearOperator(...)
X = ... # shape [..., N], batch vector
Y = operator.matvec(X)
Y.shape
==> [..., M]
Y[..., :] = sum_j A[..., :, j] X[..., j]
| Args | |
|---|---|
| x | Tensorwith compatible shape and samedtypeasself.xis treated as a [batch] vector meaning for every set of leading
dimensions, the last dimension defines a vector.
See class docstring for definition of compatibility. | 
| adjoint | Python bool.  IfTrue, left multiply by the adjoint:A^H x. | 
| name | A name for this Op. | 
| Returns | |
|---|---|
| A Tensorwith shape[..., M]and samedtypeasself. | 
range_dimension_tensor
range_dimension_tensor(
    name='range_dimension_tensor'
)
Dimension (in the sense of vector spaces) of the range of this operator.
Determined at runtime.
If this operator acts like the batch matrix A with
A.shape = [B1,...,Bb, M, N], then this returns M.
| Args | |
|---|---|
| name | A name for this Op. | 
| Returns | |
|---|---|
| int32Tensor | 
shape_tensor
shape_tensor(
    name='shape_tensor'
)
Shape of this LinearOperator, determined at runtime.
If this operator acts like the batch matrix A with
A.shape = [B1,...,Bb, M, N], then this returns a Tensor holding
[B1,...,Bb, M, N], equivalent to tf.shape(A).
| Args | |
|---|---|
| name | A name for this Op. | 
| Returns | |
|---|---|
| int32Tensor | 
solve
solve(
    rhs, adjoint=False, adjoint_arg=False, name='solve'
)
Solve (exact or approx) R (batch) systems of equations: A X = rhs.
The returned Tensor will be close to an exact solution if A is well
conditioned. Otherwise closeness will vary. See class docstring for details.
Examples:
# Make an operator acting like batch matrix A.  Assume A.shape = [..., M, N]
operator = LinearOperator(...)
operator.shape = [..., M, N]
# Solve R > 0 linear systems for every member of the batch.
RHS = ... # shape [..., M, R]
X = operator.solve(RHS)
# X[..., :, r] is the solution to the r'th linear system
# sum_j A[..., :, j] X[..., j, r] = RHS[..., :, r]
operator.matmul(X)
==> RHS
| Args | |
|---|---|
| rhs | Tensorwith samedtypeas this operator and compatible shape.rhsis treated like a [batch] matrix meaning for every set of leading
dimensions, the last two dimensions defines a matrix.
See class docstring for definition of compatibility. | 
| adjoint | Python bool.  IfTrue, solve the system involving the adjoint
of thisLinearOperator:A^H X = rhs. | 
| adjoint_arg | Python bool.  IfTrue, solveA X = rhs^Hwhererhs^His the hermitian transpose (transposition and complex conjugation). | 
| name | A name scope to use for ops added by this method. | 
| Returns | |
|---|---|
| Tensorwith shape[...,N, R]and samedtypeasrhs. | 
| Raises | |
|---|---|
| NotImplementedError | If self.is_non_singularoris_squareis False. | 
solvevec
solvevec(
    rhs, adjoint=False, name='solve'
)
Solve single equation with best effort: A X = rhs.
The returned Tensor will be close to an exact solution if A is well
conditioned. Otherwise closeness will vary. See class docstring for details.
Examples:
# Make an operator acting like batch matrix A.  Assume A.shape = [..., M, N]
operator = LinearOperator(...)
operator.shape = [..., M, N]
# Solve one linear system for every member of the batch.
RHS = ... # shape [..., M]
X = operator.solvevec(RHS)
# X is the solution to the linear system
# sum_j A[..., :, j] X[..., j] = RHS[..., :]
operator.matvec(X)
==> RHS
| Args | |
|---|---|
| rhs | Tensorwith samedtypeas this operator.rhsis treated like a [batch] vector meaning for every set of leading
dimensions, the last dimension defines a vector.  See class docstring
for definition of compatibility regarding batch dimensions. | 
| adjoint | Python bool.  IfTrue, solve the system involving the adjoint
of thisLinearOperator:A^H X = rhs. | 
| name | A name scope to use for ops added by this method. | 
| Returns | |
|---|---|
| Tensorwith shape[...,N]and samedtypeasrhs. | 
| Raises | |
|---|---|
| NotImplementedError | If self.is_non_singularoris_squareis False. | 
tensor_rank_tensor
tensor_rank_tensor(
    name='tensor_rank_tensor'
)
Rank (in the sense of tensors) of matrix corresponding to this operator.
If this operator acts like the batch matrix A with
A.shape = [B1,...,Bb, M, N], then this returns b + 2.
| Args | |
|---|---|
| name | A name for this Op. | 
| Returns | |
|---|---|
| int32Tensor, determined at runtime. | 
to_dense
to_dense(
    name='to_dense'
)
Return a dense (batch) matrix representing this operator.
trace
trace(
    name='trace'
)
Trace of the linear operator, equal to sum of self.diag_part().
If the operator is square, this is also the sum of the eigenvalues.
| Args | |
|---|---|
| name | A name for this Op. | 
| Returns | |
|---|---|
| Shape [B1,...,Bb]Tensorof samedtypeasself. |