ML Community Day is November 9! Join us for updates from TensorFlow, JAX, and more Learn more


LinearOperator that wraps a [batch] matrix.

Inherits From: LinearOperator, Module

Used in the notebooks

Used in the tutorials

This operator wraps a [batch] matrix A (which is a Tensor) with shape [B1,...,Bb, M, N] for some b >= 0. The first b indices index a batch member. For every batch index (i1,...,ib), A[i1,...,ib, : :] is an M x N matrix.

# Create a 2 x 2 linear operator.
matrix = [[1., 2.], [3., 4.]]
operator = LinearOperatorFullMatrix(matrix)

==> [[1., 2.]
     [3., 4.]]

==> [2, 2]

==> scalar Tensor

x = ... Shape [2, 4] Tensor
==> Shape [2, 4] Tensor

# Create a [2, 3] batch of 4 x 4 linear operators.
matrix = tf.random.normal(shape=[2, 3, 4, 4])
operator = LinearOperatorFullMatrix(matrix)

Shape compatibility

This operator acts on [batch] matrix with compatible shape. x is a batch matrix with compatible shape for matmul and solve if

operator.shape = [B1,...,Bb] + [M, N],  with b >= 0
x.shape =        [B1,...,Bb] + [N, R],  with R >= 0.


LinearOperatorFullMatrix has exactly the same performance as would be achieved by using standard TensorFlow matrix ops. Intelligent choices are made based on the following initialization hints.

  • If dtype is real, and is_self_adjoint and is_positive_definite, a Cholesky factorization is used for the determinant and solve.

In all cases, suppose operator is a LinearOperatorFullMatrix of shape [M, N], and x.shape = [N, R]. Then

  • operator.matmul(x) is O(M * N * R).
  • If M=N, operator.solve(x) is O(N^3 * R).
  • If M=N, operator.determinant() is O(N^3).

If instead operator and x have shape [B1,...,Bb, M, N] and [B1,...,Bb, N, R], every operation increases in complexity by B1*...*Bb.

Matrix property hints

This LinearOperator is initialized with b