tf.linalg.LinearOperatorBlockLowerTriangular
Объединяет LinearOperators в блочно-нижнетриугольную матрицу.
Наследуется от: LinearOperator, Module
tf.linalg.LinearOperatorBlockLowerTriangular(
operators, is_non_singular=None, is_self_adjoint=None,
is_positive_definite=None, is_square=None,
name='LinearOperatorBlockLowerTriangular'
)
Этот оператор инициализируется вложенным списком линейных операторов, которые объединяются в новую LinearOperator, чья матричная структура квадратная, и каждый оператор расположен на или ниже главной диагонали, а в остальных местах - нули. Каждый элемент внешнего списка — это список LinearOperators соответствующий разбиению строк блочной структуры. Количество LinearOperator в разбиении строки i должно быть равно i.
Например, блочно-нижнетриугольный оператор 3 x 3 LinearOperatorBlockLowerTriangular инициализируется списком [[op_00], [op_10, op_11], [op_20, op_21, op_22]], где op_ij, i < 3, j <= i, представляют собой экземпляры LinearOperator. Этот оператор ведет себя как следующая блочно-нижнетриугольная матрица, где 0 представляет собой матрицы нулей соответствующего размера [пакет]:
[[op_00, 0, 0], [op_10, op_11, 0], [op_20, op_21, op_22]]
Каждый op_jj на главной диагонали должен представлять квадратную матрицу и, следовательно, иметь размер batch_shape_j + [M_j, M_j]. LinearOperator в строке j блочной структуры должны иметь размер range_dimension, равный размеру op_jj, и LinearOperators в столбце j должен иметь размер domain_dimension, равный размеру op_jj.
Если каждый op_jj на главной диагонали имеет размер batch_shape_j + [M_j, M_j], то объединённый оператор имеет размер broadcast_batch_shape + [sum M_j, sum M_j], где broadcast_batch_shape — это взаимное расширение batch_shape_j, j = 0, 1, ..., J, предполагая, что промежуточные размеры пакетов согласуются. Даже если объединённый размер хорошо определён, методы объединённого оператора могут потерпеть неудачу из-за отсутствия возможности трансляции в методах определяющих операторов.
Например, чтобы создать линейный оператор 4x4, объединённый из трех 2x2 операторов:
>>> operator_0 = tf.linalg.LinearOperatorFullMatrix([[1., 2.], [3., 4.]]) >>> operator_1 = tf.linalg.LinearOperatorFullMatrix([[1., 0.], [0., 1.]]) >>> operator_2 = tf.linalg.LinearOperatorLowerTriangular([[5., 6.], [7., 8]]) >>> operator = LinearOperatorBlockLowerTriangular( ... [[operator_0], [operator_1, operator_2]])
operator.to_dense()
<tf.Tensor: shape=(4, 4), dtype=float32, numpy=
array([[1., 2., 0., 0.],
[3., 4., 0., 0.],
[1., 0., 5., 0.],
[0., 1., 7., 8.]], dtype=float32)>
operator.shape TensorShape([4, 4])
operator.log_abs_determinant() <tf.Tensor: shape=(), dtype=float32, numpy=4.3820267>
x0 = [[1., 6.], [-3., 4.]]
x1 = [[0., 2.], [4., 0.]]
x = tf.concat([x0, x1], 0) # Shape [2, 4] Tensor
operator.matmul(x)
<tf.Tensor: shape=(4, 2), dtype=float32, numpy=
array([[-5., 14.],
[-9., 34.],
[ 1., 16.],
[29., 18.]], dtype=float32)>
Вышеупомянутый matmul эквивалентен:
>>> tf.concat([operator_0.matmul(x0),
... operator_1.matmul(x0) + operator_2.matmul(x1)], axis=0)
<tf.Tensor: shape=(4, 2), dtype=float32, numpy=
array([[-5., 14.],
[-9., 34.],
[ 1., 16.],
[29., 18.]], dtype=float32)>
Совместимость размеров
Этот оператор действует на [пакет] матрицу с совместимым размером. x является матрицей пакетов с совместимым размером для matmul и solve если
operator.shape = [B1,...,Bb] + [M, N], with b >= 0 x.shape = [B1,...,Bb] + [N, R], with R >= 0.
Например:
Создать [2, 3] пакет из 4x4 линейных операторов:
>>> matrix_44 = tf.random.normal(shape=[2, 3, 4, 4]) >>> operator_44 = tf.linalg.LinearOperatorFullMatrix(matrix_44)
Создать [1, 3] пакет из 5x4 линейных операторов:
>>> matrix_54 = tf.random.normal(shape=[1, 3, 5, 4]) >>> operator_54 = tf.linalg.LinearOperatorFullMatrix(matrix_54)
Создать [1, 3] пакет из 5x5 линейных операторов:
>>> matrix_55 = tf.random.normal(shape=[1, 3, 5, 5]) >>> operator_55 = tf.linalg.LinearOperatorFullMatrix(matrix_55)
Объединить, чтобы создать [2, 3] пакет из 9x9 операторов:
>>> operator_99 = LinearOperatorBlockLowerTriangular( ... [[operator_44], [operator_54, operator_55]]) >>> operator_99.shape TensorShape([2, 3, 9, 9])
Создать пакет векторов размером [2, 1, 9] и применить к нему оператор.
>>> x = tf.random.normal(shape=[2, 1, 9]) >>> y = operator_99.matvec(x) >>> y.shape TensorShape([2, 3, 9])
Создать блочный список векторов и применить к нему оператор. Возвращается блочный список.
>>> x4 = tf.random.normal(shape=[2, 1, 4]) >>> x5 = tf.random.normal(shape=[2, 3, 5]) >>> y_blockwise = operator_99.matvec([x4, x5]) >>> y_blockwise[0].shape TensorShape([2, 3, 4]) >>> y_blockwise[1].shape TensorShape([2, 3, 5])
Производительность
Предположим, operator представляет собой LinearOperatorBlockLowerTriangular, состоящий из D разбиений по строкам и D разбиений по столбцам, так что общее количество операторов равно N = D * (D + 1) // 2.
-
operator.matmulимеет сложность, равную сумме сложностей индивидуальных операторов. -
operator.solveимеет сложность, равную сумме сложностей операторов на главной диагонали и сложностей операторов вне главной диагонали. -
operator.determinantимеет сложность, равную сумме сложностей операторов на главной диагонали.
Свойства матрицы
Этот LinearOperator инициализируется логическими флагами вида is_X, для X = non_singular, self_adjoint, positive_definite, square. Они имеют следующее значение:
- Если
is_X == True, вызывающие стороны должны ожидать, что оператор имеет свойствоX. Это обещание, которое должно быть выполнено, но это не утверждение во время выполнения. Например, конечная точность с плавающей точкой может привести к нарушению этих обещаний. - Если
is_X == False, вызывающие стороны должны ожидать, что у оператора нетX. - Если
is_X == None(по умолчанию), у вызывающих сторон не должно быть ожиданий ни по одному из направлений.
| Аргументы | |
|---|---|
operators | Список списков объектов линейных операторов, каждый с одинаковым dtype. Каждый элемент operators соответствует разбиению строк сверху вниз. Операторы в каждом разбиении строк заполняются слева направо. Например, operators = [[op_0], [op_1, op_2], [op_3, op_4, op_5]] создает LinearOperatorBlockLowerTriangular с полной блочной структурой [[op_0, 0, 0], [op_1, op_2, 0], [op_3, op_4, op_5]]. Количество операторов в i-й строке должно быть равно i, так, чтобы каждый оператор располагался на или ниже главной диагонали блочной структуры. LinearOperator на главной диагонали (последние элементы каждой строки) должны быть квадратными. Другие LinearOperator должны иметь размер области определения, равный размеру области определения LinearOperator в том же разбиении по столбцам, и размер области значений, равный размеру области значений LinearOperator в том же разбиении по строкам. |
is_non_singular | Ожидать, что этот оператор невырожден. |
is_self_adjoint | Ожидать, что этот оператор равен своему эрмитовому транспонированию. |
is_positive_definite | Ожидать, что этот оператор положительно определён, что означает, что квадратичная форма x^H A x имеет положительную действительную часть для всех ненулевых x. Обратите внимание, что мы не требуем, чтобы оператор был самосопряжённым, чтобы быть положительно определённым. См.: https://en.wikipedia.org/wiki/Positive-definite_matrix#Extension_for_non-symmetric_matrices |
is_square | Ожидать, что этот оператор действует как квадратные [пакетные] матрицы. Это вызовет ValueError если установлено значение False. |
name | Имя для этого LinearOperator. |
| Возбуждения | |
|---|---|
TypeError | Если все операторы не имеют одинаковый dtype. |
ValueError | Если operators пуст, содержит ошибочное количество элементов или содержит операторы с несовместимыми размерами. |
| Атрибуты | |
|---|---|
H | Возвращает сопряжённый оператор к текущему LinearOperator. Дан |
batch_shape | Размерность пакетных измерений данного LinearOperator. Если этот оператор действует как пакетная матрица |
domain_dimension | Размерность (в смысле векторных пространств) области определения этого оператора. Если этот оператор действует как пакетная матрица |
dtype | Размерность DType пакетов, обрабатываемых данным LinearOperator. |
graph_parents | Список зависимостей графа этого LinearOperator. (устаревшее)
|
is_non_singular | |
is_positive_definite | |
is_self_adjoint | |
is_square | Возвращает True/False в зависимости от того, является ли оператор квадратным. |
operators | |
parameters | Словарь параметров, используемых для создания этого LinearOperator. |
range_dimension | Размерность (в смысле векторных пространств) области значений этого оператора. Если этот оператор действует как пакетная матрица |
shape | Размерность данного LinearOperator. Если этот оператор действует как пакетная матрица |
tensor_rank | Ранг (в смысле тензоров) матрицы, соответствующей данному оператору. Если этот оператор действует как пакетная матрица |
Методы
add_to_tensor
add_to_tensor(
x, name='add_to_tensor'
)
Добавить матрицу, представленную этим оператором, к x. Эквивалентно A + x.
| Аргументы | |
|---|---|
x | Tensor со тем же dtype и размером, транслируемым в self.shape. |
name | Имя, которое нужно присвоить этому Op. |
| Возвращаемое значение | |
|---|---|
A Tensor с формой широковещательной передачи и такими же dtype как у self. |
data-text="adjoint" id="adjoint">adjoint
adjoint(
name='adjoint'
)
Возвращает сопряжённое значение текущего LinearOperator.
Учитывая A , представляющее этот LinearOperator, вернуть A*. Обратите внимание, что вызов self.adjoint() и self.H эквивалентны.
| Аргументы | |
|---|---|
name | Имя для этого Op . |
| Возвращаемое значение | |
|---|---|
LinearOperator , представляющий сопряжённое значение этого LinearOperator . |
data-text="assert_non_singular" id="assert_non_singular">assert_non_singular
assert_non_singular(
name='assert_non_singular'
)
Возвращает Op , который утверждает, что этот оператор не является вырожденным.
Этот оператор считается невырожденным, если
ConditionNumber < max{100, range_dimension, domain_dimension} * eps,
eps := np.finfo(self.dtype.as_numpy_dtype).eps
| Аргументы | |
|---|---|
name | Строка имени, которая должна быть добавлена к созданным операциям. |
| Возвращаемое значение | |
|---|---|
Assert Op, который, при запуске, поднимет InvalidArgumentError , если оператор вырожден. |
data-text="assert_positive_definite" id="assert_positive_definite">assert_positive_definite
assert_positive_definite(
name='assert_positive_definite'
)
Возвращает Op , который утверждает, что этот оператор положительно определён.
Здесь положительно определённый означает, что квадратичная форма x^H A x имеет положительную действительную часть для всех ненулевых x. Обратите внимание, что для того, чтобы оператор был положительно определённым, не требуется, чтобы он был самосопряжённым.
| Аргументы | |
|---|---|
name | Имя для этого Op . |
| Возвращаемое значение | |
|---|---|
Assert Op, который, при запуске, поднимет InvalidArgumentError , если оператор не является положительно определённым. |
data-text="assert_self_adjoint" id="assert_self_adjoint">assert_self_adjoint
assert_self_adjoint(
name='assert_self_adjoint'
)
Возвращает Op , который утверждает, что этот оператор является самосопряжённым.
Здесь мы проверяем, что этот оператор точно равен своему эрмитовому транспонированию.
| Аргументы | |
|---|---|
name | Строка имени, которая должна быть добавлена к созданным операциям. |
| Возвращаемое значение | |
|---|---|
Assert Op, который, при запуске, поднимет InvalidArgumentError , если оператор не является самосопряжённым. |
data-text="batch_shape_tensor" id="batch_shape_tensor">batch_shape_tensor
batch_shape_tensor(
name='batch_shape_tensor'
)
Форма пакетных измерений этого оператора, определяемая во время выполнения.
Если этот оператор действует как пакетная матрица A с A.shape = [B1,...,Bb, M, N], то это возвращает Tensor , содержащий [B1,...,Bb].
| Аргументы | |
|---|---|
name | Имя для этого Op . |
| Возвращаемое значение | |
|---|---|
int32 Tensor |
data-text="cholesky" id="cholesky">cholesky
cholesky(
name='cholesky'
)
Возвращает фактор Холецкого как LinearOperator.
Учитывая A , представляющее этот LinearOperator, если A положительно определённое самосопряжённое, вернуть L, где A = L L^T, то есть разложение Холецкого.
| Аргументы | |
|---|---|
name | Имя для этого Op . |
| Возвращаемое значение | |
|---|---|
LinearOperator , представляющий нижнюю треугольную матрицу в разложении Холецкого. |
| Исключения | |
|---|---|
ValueError | При LinearOperator не предполагается быть положительно определённым и самосопряжённым. |
data-text="cond" id="cond">cond
cond(
name='cond'
)
Возвращает число обусловленности этого линейного оператора.
| Аргументы | |
|---|---|
name | Имя для этого Op . |
| Возвращаемое значение | |
|---|---|
Форма [B1,...,Bb] Tensor с теми же dtype , что и у self . |
data-text="determinant" id="determinant">determinant
determinant(
name='det'
)
Определитель для каждого участника пакета.
| Аргументы | |
|---|---|
name | Имя для этого Op . |
| Возвращаемое значение | |
|---|---|
Tensor с формой self.batch_shape и теми же dtype , что и у self . |
| Исключения | |
|---|---|
NotImplementedError | Если self.is_square является False . |
data-text="diag_part" id="diag_part">diag_part
diag_part(
name='diag_part'
)
Эффективно получить [пакетную] диагональную часть этого оператора.
Если этот оператор имеет форму [B1,...,Bb, M, N], это возвращает Tensor diagonal, с формой [B1,...,Bb, min(M, N)], где 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.]
| Аргументы | |
|---|---|
name | Имя для этого Op . |
| Возвращаемое значение | |
|---|---|
diag_part | A Tensor с такими же dtype как self. |
data-text="domain_dimension_tensor" id="domain_dimension_tensor">domain_dimension_tensor
domain_dimension_tensor(
name='domain_dimension_tensor'
)
Размерность (в смысле векторных пространств) области действия этого оператора.
Определяется во время выполнения.
Если этот оператор действует как пакетная матрица A с A.shape = [B1,...,Bb, M, N], то это возвращает N.
| Аргументы | |
|---|---|
name | Имя для этого Op . |
| Возвращаемое значение | |
|---|---|
int32 Tensor |
data-text="eigvals" id="eigvals">eigvals
eigvals(
name='eigvals'
)
Возвращает собственные значения этого линейного оператора.
Если оператор помечен как самосопряжённый (через is_self_adjoint ), это вычисление может быть более эффективным.
Примечание: В настоящее время это поддерживает только самосопряжённые операторы.
| Аргументы | |
|---|---|
name | Имя для этого Op . |
| Возвращаемые значения | |
|---|---|
Форма [B1,...,Bb, N] Tensor той же dtype что и self. |
inverse
inverse(
name='inverse'
)
Возвращает обратную величину для этого LinearOperator.
Учитывая A , представляющий этот LinearOperator, вернуть LinearOperator , представляющий A^-1.
| Аргументы | |
|---|---|
name | Область именования операций, используемая этим методом. |
| Возвращаемые значения | |
|---|---|
LinearOperator , представляющий обратную матрицу. |
| Исключения | |
|---|---|
ValueError | При отсутствии намека на то, что LinearOperator является non_singular. |
log_abs_determinant
log_abs_determinant(
name='log_abs_det'
)
Логарифм абсолютного значения определителя для каждого члена пакета.
| Аргументы | |
|---|---|
name | Имя для этого Op. |
| Возвращаемые значения | |
|---|---|
Tensor с формой self.batch_shape и той же dtype , что и self. |
| Исключения | |
|---|---|
NotImplementedError | Если self.is_square является False. |
matmul
matmul(
x, adjoint=False, adjoint_arg=False, name='matmul'
)
Преобразование [пакетной] матрицы x с левым умножением: 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]
| Аргументы | |
|---|---|
x | LinearOperator, Tensor с совместимой формой и той же dtype , что и self, или итерируемый блок вида LinearOperator или Tensor. См. строку документа класса для определения совместимости форм. |
adjoint | Python bool. Если True, левое умножение на сопряжённую: A^H x. |
adjoint_arg | Python bool. Если True, вычислить A x^H, где x^H - это эрмитово транспонирование (транспонирование и комплексное сопряжение). |
name | Имя для этого Op. |
| Возвращаемые значения | |
|---|---|
LinearOperator или Tensor с формой [..., M, R] и той же dtype , что и self, или если x является блочным, список Tensor с формами, которые конкатенируются в [..., M, R]. |
matvec
matvec(
x, adjoint=False, name='matvec'
)
Преобразование [пакетного] вектора x с левым умножением: x --> Ax.
# Make an operator acting like batch matrix 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]
| Аргументы | |
|---|---|
x | Tensor с совместимой формой и той же dtype , что и self, или итерируемый набор Tensor . Tensor обрабатываются как [пакетные] векторы, что означает, что для каждого набора ведущих измерений последнее измерение определяет вектор. См. строку документа класса для определения совместимости. |
adjoint | Python bool. Если True, левое умножение на сопряжённую: A^H x. |
name | Имя для этого Op. |
| Возвращаемые значения | |
|---|---|
Tensor с формой [..., M] и той же dtype , что и self. |
range_dimension_tensor
range_dimension_tensor(
name='range_dimension_tensor'
)
Размерность (в смысле векторных пространств) области значений этого оператора.
Определяется во время выполнения.
Если этот оператор действует как пакетная матрица A с A.shape = [B1,...,Bb, M, N], то это возвращает M.
| Аргументы | |
|---|---|
name | Имя для этого Op. |
| Возвращаемые значения | |
|---|---|
int32 Tensor |
shape_tensor
shape_tensor(
name='shape_tensor'
)
Форма этого LinearOperator, определённая во время выполнения.
Если этот оператор действует как пакетная матрица A с A.shape = [B1,...,Bb, M, N], тогда это возвращает Tensor , содержащую [B1,...,Bb, M, N], эквивалентную tf.shape(A).
| Аргументы | |
|---|---|
name | Имя для этого Op. |
| Возвращаемые значения | |
|---|---|
int32 Tensor |
solve
solve(
rhs, adjoint=False, adjoint_arg=False, name='solve'
)
Решить (точно или приближённо) R (пакет) систем уравнений: A X = rhs.
Возвращаемое Tensor будет близко к точному решению, если A хорошо обусловлено. В противном случае близость будет варьироваться. См. строку документа класса для получения подробностей.
Дана блочная n + 1-на-n + 1 линейная оператор:
op = [[A_00 0 ... 0 ... 0], [A_10 A_11 ... 0 ... 0], ... [A_k0 A_k1 ... A_kk ... 0], ... [A_n0 A_n1 ... A_nk ... A_nn]]
мы ищем x = op.solve(y) заметив, что
y_k = A_k0.matmul(x_0) + A_k1.matmul(x_1) + ... + A_kk.matmul(x_k)
и поэтому
x_k = A_kk.solve(y_k - A_k0.matmul(x_0) - ... - A_k(k-1).matmul(x_(k-1)))
где x_k и y_k являются k блоками, полученными путём разложения x и y вдоль соответствующих осей.
Сначала мы решаем x_0 = A_00.solve(y_0). Индуктивно решаем x_k, k = 1..n, при условии x_0..x_(k-1).
Аналогично решается случай сопряжения, начиная с x_n = A_nn.solve(y_n, adjoint=True) и двигаясь назад.
Примеры:
# 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
| Аргументы | |
|---|---|
rhs | Tensor с той же dtype , что и у этого оператора, и совместимой формой, или список Tensor . Tensor обрабатываются как [пакетные] матрицы, то есть для каждого набора ведущих измерений последние два измерения определяют матрицу. См. строку документа класса для определения совместимости. |
adjoint | Python bool. Если True, решить систему, связанную с сопряжённым этим LinearOperator : A^H X = rhs. |
adjoint_arg | Python bool. Если True, решить A X = rhs^H , где rhs^H - это эрмитово транспонирование (транспонирование и комплексное сопряжение). |
name | Область именования операций, используемая этим методом. |
| Возвращаемые значения | |
|---|---|
Tensor с формой [...,N, R] и той же dtype , что и rhs. |
| Исключения | |
|---|---|
NotImplementedError | Если self.is_non_singular или is_square ложно. |
solvevec
solvevec(
rhs, adjoint=False, name='solve'
)
Решить единственное уравнение с максимальной эффективностью: A X = rhs.
Возвращаемое значение Tensor будет близко к точному решению, если A хорошо обусловлено. В противном случае близость будет меняться. Подробности см. в документации класса.
Примеры:
# 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
| Аргументы | |
|---|---|
rhs | Tensor с теми же dtype , что и у этого оператора, или список Tensor (для блочных операторов). Tensor обрабатываются как [пакетные] векторы, что означает, что для каждой группы ведущих измерений последнее измерение определяет вектор. Определение совместимости относительно пакетных измерений см. в документации класса. |
adjoint | Python bool. Если True, решите систему, вовлекая сопряжённый вид этого LinearOperator: A^H X = rhs. |
name | Имя области имён для операций, добавленных этим методом. |
| Возвращаемое значение | |
|---|---|
Tensor с формой [...,N] и теми же dtype , что и у rhs. |
| Исключения | |
|---|---|
NotImplementedError | Если self.is_non_singular или is_square равно False. |
tensor_rank_tensor
tensor_rank_tensor(
name='tensor_rank_tensor'
)
Ранг (в смысле тензоров) матрицы, соответствующей этому оператору.
Если этот оператор действует как пакетная матрица A с A.shape = [B1,...,Bb, M, N], то возвращается b + 2.
| Аргументы | |
|---|---|
name | Имя для этого Op. |
| Возвращаемое значение | |
|---|---|
int32 Tensor, определяемое во время выполнения. |
to_dense
to_dense(
name='to_dense'
)
Возвращает плотный (пакетный) матричный вид, представляющий этот оператор.
trace
trace(
name='trace'
)
След линейного оператора, равный сумме self.diag_part().
Если оператор квадратный, это также сумма собственных значений.
| Аргументы | |
|---|---|
name | Имя для этого Op. |
| Возвращаемое значение | |
|---|---|
Форма [B1,...,Bb] Tensor с теми же dtype , что и у self. |
__matmul__
__matmul__(
other
)
© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.4/api_docs/python/tf/linalg/LinearOperatorBlockLowerTriangular