Missed TensorFlow Dev Summit? Check out the video playlist. Watch recordings


View source on GitHub

The inverse LU decomposition, X == lu_reconstruct(*tf.linalg.lu(X)).

    lower_upper, perm, validate_args=False, name=None


  • lower_upper: lu as returned by tf.linalg.lu, i.e., if matmul(P, matmul(L, U)) = X then lower_upper = L + U - eye.
  • perm: p as returned by tf.linag.lu, i.e., if matmul(P, matmul(L, U)) = X then perm = argmax(P).
  • validate_args: Python bool indicating whether arguments should be checked for correctness. Default value: False (i.e., don't validate arguments).
  • name: Python str name given to ops managed by this object. Default value: None (i.e., 'lu_reconstruct').


  • x: The original input to tf.linalg.lu, i.e., x as in, lu_reconstruct(*tf.linalg.lu(x)).


import numpy as np
from tensorflow_probability.python.internal.backend import numpy as tf
import tensorflow_probability as tfp; tfp = tfp.experimental.substrates.numpy

x = [[[3., 4], [1, 2]],
     [[7., 8], [3, 4]]]
x_reconstructed = tfp.math.lu_reconstruct(*tf.linalg.lu(x))
tf.assert_near(x, x_reconstructed)
# ==> True