Type LinearOperatorKronecker
Namespace tensorflow.linalg
Parent LinearOperator
Interfaces ILinearOperatorKronecker
Kronecker product between two `LinearOperators`.  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.
#### 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
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.
* If `is_X == False`, callers should expect the operator to not have `X`.
* If `is_X == None` (the default), callers should have no expectation either
way. 
		
		
		
			
  Show Example
  
			# 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 
Properties
- batch_shape
 - batch_shape_dyn
 - domain_dimension
 - domain_dimension_dyn
 - dtype
 - dtype_dyn
 - graph_parents
 - graph_parents_dyn
 - is_non_singular
 - is_non_singular_dyn
 - is_positive_definite
 - is_positive_definite_dyn
 - is_self_adjoint
 - is_self_adjoint_dyn
 - is_square
 - is_square_dyn
 - name
 - name_dyn
 - name_scope
 - name_scope_dyn
 - operators
 - operators_dyn
 - PythonObject
 - range_dimension
 - range_dimension_dyn
 - shape
 - shape_dyn
 - submodules
 - submodules_dyn
 - tensor_rank
 - tensor_rank_dyn
 - trainable_variables
 - trainable_variables_dyn
 - variables
 - variables_dyn