tf.linalg.matmul
Stay organized with collections
Save and categorize content based on your preferences.
Multiplies matrix a
by matrix b
, producing a
* b
.
tf.linalg.matmul(
a,
b,
transpose_a=False,
transpose_b=False,
adjoint_a=False,
adjoint_b=False,
a_is_sparse=False,
b_is_sparse=False,
output_type=None,
name=None
)
The inputs must, following any transpositions, be tensors of rank >= 2
where the inner 2 dimensions specify valid matrix multiplication dimensions,
and any further outer dimensions specify matching batch size.
Both matrices must be of the same type. The supported types are:
bfloat16
, float16
, float32
, float64
, int32
, int64
,
complex64
, complex128
.
Either matrix can be transposed or adjointed (conjugated and transposed) on
the fly by setting one of the corresponding flag to True
. These are False
by default.
If one or both of the matrices contain a lot of zeros, a more efficient
multiplication algorithm can be used by setting the corresponding
a_is_sparse
or b_is_sparse
flag to True
. These are False
by default.
This optimization is only available for plain matrices (rank-2 tensors) with
datatypes bfloat16
or float32
.
A simple 2-D tensor matrix multiplication:
a = tf.constant([1, 2, 3, 4, 5, 6], shape=[2, 3])
a # 2-D tensor
<tf.Tensor: shape=(2, 3), dtype=int32, numpy=
array([[1, 2, 3],
[4, 5, 6]], dtype=int32)>
b = tf.constant([7, 8, 9, 10, 11, 12], shape=[3, 2])
b # 2-D tensor
<tf.Tensor: shape=(3, 2), dtype=int32, numpy=
array([[ 7, 8],
[ 9, 10],
[11, 12]], dtype=int32)>
c = tf.matmul(a, b)
c # `a` * `b`
<tf.Tensor: shape=(2, 2), dtype=int32, numpy=
array([[ 58, 64],
[139, 154]], dtype=int32)>
A batch matrix multiplication with batch shape [2]:
a = tf.constant(np.arange(1, 13, dtype=np.int32), shape=[2, 2, 3])
a # 3-D tensor
<tf.Tensor: shape=(2, 2, 3), dtype=int32, numpy=
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]], dtype=int32)>
b = tf.constant(np.arange(13, 25, dtype=np.int32), shape=[2, 3, 2])
b # 3-D tensor
<tf.Tensor: shape=(2, 3, 2), dtype=int32, numpy=
array([[[13, 14],
[15, 16],
[17, 18]],
[[19, 20],
[21, 22],
[23, 24]]], dtype=int32)>
c = tf.matmul(a, b)
c # `a` * `b`
<tf.Tensor: shape=(2, 2, 2), dtype=int32, numpy=
array([[[ 94, 100],
[229, 244]],
[[508, 532],
[697, 730]]], dtype=int32)>
Since python >= 3.5 the @ operator is supported
(see PEP 465). In TensorFlow,
it simply calls the tf.matmul()
function, so the following lines are
equivalent:
d = a @ b @ [[10], [11]]
d = tf.matmul(tf.matmul(a, b), [[10], [11]])
Args |
a
|
tf.Tensor of type float16 , float32 , float64 , int32 ,
complex64 , complex128 and rank > 1.
|
b
|
tf.Tensor with same type and rank as a .
|
transpose_a
|
If True , a is transposed before multiplication.
|
transpose_b
|
If True , b is transposed before multiplication.
|
adjoint_a
|
If True , a is conjugated and transposed before
multiplication.
|
adjoint_b
|
If True , b is conjugated and transposed before
multiplication.
|
a_is_sparse
|
If True , a is treated as a sparse matrix. Notice, this
does not support tf.sparse.SparseTensor , it just makes optimizations
that assume most values in a are zero.
See tf.sparse.sparse_dense_matmul
for some support for tf.sparse.SparseTensor multiplication.
|
b_is_sparse
|
If True , b is treated as a sparse matrix. Notice, this
does not support tf.sparse.SparseTensor , it just makes optimizations
that assume most values in b are zero.
See tf.sparse.sparse_dense_matmul
for some support for tf.sparse.SparseTensor multiplication.
|
output_type
|
The output datatype if needed. Defaults to None in which case
the output_type is the same as input type. Currently only works when input
tensors are type (u)int8 and output_type can be int32.
|
name
|
Name for the operation (optional).
|
Returns |
A tf.Tensor of the same type as a and b where each inner-most matrix
is the product of the corresponding matrices in a and b , e.g. if all
transpose or adjoint attributes are False :
output[..., i, j] = sum_k (a[..., i, k] * b[..., k, j]) ,
for all indices i , j .
|
Note
|
This is matrix product, not element-wise product.
|
Raises |
ValueError
|
If transpose_a and adjoint_a , or transpose_b and
adjoint_b are both set to True .
|
TypeError
|
If output_type is specified but the types of a , b and
output_type is not (u)int8, (u)int8 and int32.
|
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates. Some content is licensed under the numpy license.
Last updated 2023-10-06 UTC.
[null,null,["Last updated 2023-10-06 UTC."],[],[],null,["# tf.linalg.matmul\n\n\u003cbr /\u003e\n\n|------------------------------------------------------------------------------------------------------------------------------|\n| [View source on GitHub](https://github.com/tensorflow/tensorflow/blob/v2.13.1/tensorflow/python/ops/math_ops.py#L3569-L3795) |\n\nMultiplies matrix `a` by matrix `b`, producing `a` \\* `b`.\n\n#### View aliases\n\n\n**Main aliases**\n\n[`tf.matmul`](https://www.tensorflow.org/api_docs/python/tf/linalg/matmul)\n**Compat aliases for migration**\n\nSee\n[Migration guide](https://www.tensorflow.org/guide/migrate) for\nmore details.\n\n[`tf.compat.v1.linalg.matmul`](https://www.tensorflow.org/api_docs/python/tf/linalg/matmul), [`tf.compat.v1.matmul`](https://www.tensorflow.org/api_docs/python/tf/linalg/matmul)\n\n\u003cbr /\u003e\n\n tf.linalg.matmul(\n a,\n b,\n transpose_a=False,\n transpose_b=False,\n adjoint_a=False,\n adjoint_b=False,\n a_is_sparse=False,\n b_is_sparse=False,\n output_type=None,\n name=None\n )\n\nThe inputs must, following any transpositions, be tensors of rank \\\u003e= 2\nwhere the inner 2 dimensions specify valid matrix multiplication dimensions,\nand any further outer dimensions specify matching batch size.\n\nBoth matrices must be of the same type. The supported types are:\n`bfloat16`, `float16`, `float32`, `float64`, `int32`, `int64`,\n`complex64`, `complex128`.\n\nEither matrix can be transposed or adjointed (conjugated and transposed) on\nthe fly by setting one of the corresponding flag to `True`. These are `False`\nby default.\n\nIf one or both of the matrices contain a lot of zeros, a more efficient\nmultiplication algorithm can be used by setting the corresponding\n`a_is_sparse` or `b_is_sparse` flag to `True`. These are `False` by default.\nThis optimization is only available for plain matrices (rank-2 tensors) with\ndatatypes `bfloat16` or `float32`.\n\nA simple 2-D tensor matrix multiplication: \n\n a = tf.constant([1, 2, 3, 4, 5, 6], shape=[2, 3])\n a # 2-D tensor\n \u003ctf.Tensor: shape=(2, 3), dtype=int32, numpy=\n array([[1, 2, 3],\n [4, 5, 6]], dtype=int32)\u003e\n b = tf.constant([7, 8, 9, 10, 11, 12], shape=[3, 2])\n b # 2-D tensor\n \u003ctf.Tensor: shape=(3, 2), dtype=int32, numpy=\n array([[ 7, 8],\n [ 9, 10],\n [11, 12]], dtype=int32)\u003e\n c = tf.matmul(a, b)\n c # `a` * `b`\n \u003ctf.Tensor: shape=(2, 2), dtype=int32, numpy=\n array([[ 58, 64],\n [139, 154]], dtype=int32)\u003e\n\nA batch matrix multiplication with batch shape \\[2\\]: \n\n a = tf.constant(np.arange(1, 13, dtype=np.int32), shape=[2, 2, 3])\n a # 3-D tensor\n \u003ctf.Tensor: shape=(2, 2, 3), dtype=int32, numpy=\n array([[[ 1, 2, 3],\n [ 4, 5, 6]],\n [[ 7, 8, 9],\n [10, 11, 12]]], dtype=int32)\u003e\n b = tf.constant(np.arange(13, 25, dtype=np.int32), shape=[2, 3, 2])\n b # 3-D tensor\n \u003ctf.Tensor: shape=(2, 3, 2), dtype=int32, numpy=\n array([[[13, 14],\n [15, 16],\n [17, 18]],\n [[19, 20],\n [21, 22],\n [23, 24]]], dtype=int32)\u003e\n c = tf.matmul(a, b)\n c # `a` * `b`\n \u003ctf.Tensor: shape=(2, 2, 2), dtype=int32, numpy=\n array([[[ 94, 100],\n [229, 244]],\n [[508, 532],\n [697, 730]]], dtype=int32)\u003e\n\nSince python \\\u003e= 3.5 the @ operator is supported\n(see [PEP 465](https://www.python.org/dev/peps/pep-0465/)). In TensorFlow,\nit simply calls the [`tf.matmul()`](../../tf/linalg/matmul) function, so the following lines are\nequivalent: \n\n d = a @ b @ [[10], [11]]\n d = tf.matmul(tf.matmul(a, b), [[10], [11]])\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n| Args ---- ||\n|---------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `a` | [`tf.Tensor`](../../tf/Tensor) of type `float16`, `float32`, `float64`, `int32`, `complex64`, `complex128` and rank \\\u003e 1. |\n| `b` | [`tf.Tensor`](../../tf/Tensor) with same type and rank as `a`. |\n| `transpose_a` | If `True`, `a` is transposed before multiplication. |\n| `transpose_b` | If `True`, `b` is transposed before multiplication. |\n| `adjoint_a` | If `True`, `a` is conjugated and transposed before multiplication. |\n| `adjoint_b` | If `True`, `b` is conjugated and transposed before multiplication. |\n| `a_is_sparse` | If `True`, `a` is treated as a sparse matrix. Notice, this **does not support [`tf.sparse.SparseTensor`](../../tf/sparse/SparseTensor)** , it just makes optimizations that assume most values in `a` are zero. See [`tf.sparse.sparse_dense_matmul`](../../tf/sparse/sparse_dense_matmul) for some support for [`tf.sparse.SparseTensor`](../../tf/sparse/SparseTensor) multiplication. |\n| `b_is_sparse` | If `True`, `b` is treated as a sparse matrix. Notice, this **does not support [`tf.sparse.SparseTensor`](../../tf/sparse/SparseTensor)** , it just makes optimizations that assume most values in `b` are zero. See [`tf.sparse.sparse_dense_matmul`](../../tf/sparse/sparse_dense_matmul) for some support for [`tf.sparse.SparseTensor`](../../tf/sparse/SparseTensor) multiplication. |\n| `output_type` | The output datatype if needed. Defaults to None in which case the output_type is the same as input type. Currently only works when input tensors are type (u)int8 and output_type can be int32. |\n| `name` | Name for the operation (optional). |\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n| Returns ------- ||\n|--------|---------------------------------------------------|\n| A [`tf.Tensor`](../../tf/Tensor) of the same type as `a` and `b` where each inner-most matrix is the product of the corresponding matrices in `a` and `b`, e.g. if all transpose or adjoint attributes are `False`: \u003cbr /\u003e `output[..., i, j] = sum_k (a[..., i, k] * b[..., k, j])`, for all indices `i`, `j`. ||\n| `Note` | This is matrix product, not element-wise product. |\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n| Raises ------ ||\n|--------------|------------------------------------------------------------------------------------------------------------|\n| `ValueError` | If `transpose_a` and `adjoint_a`, or `transpose_b` and `adjoint_b` are both set to `True`. |\n| `TypeError` | If output_type is specified but the types of `a`, `b` and `output_type` is not (u)int8, (u)int8 and int32. |\n\n\u003cbr /\u003e"]]