.. _cn_api_tensor_matmul:

matmul
-------------------------------

.. py:function:: paddle.matmul(x, y, transpose_x=False, transpose_y=False, alpha=1.0, name=None)

:alias_main: paddle.matmul
:alias: paddle.matmul,paddle.tensor.matmul,paddle.tensor.linalg.matmul



输入 ``x`` 和输入 ``y`` 矩阵相乘。

两个输入的形状可为任意维度，但当任一输入维度大于3时，两个输入的维度必须相等。
实际的操作取决于 ``x`` 、 ``y`` 的维度和 ``transpose_x`` 、 ``transpose_y`` 的布尔值。具体如下：

- 如果 ``transpose`` 为真，则对应 Tensor 的后两维会转置。假定 ``x`` 是一个 shape=[D] 的一维 Tensor，则 ``x`` 非转置形状为 [1, D]，转置形状为 [D, 1]。转置之后的输入形状需满足矩阵乘法要求，即 `x_width` 与 `y_height` 相等。

- 转置后，输入的两个 Tensor 维度将为 2-D 或 n-D，将根据下列规则矩阵相乘：
    - 如果两个矩阵都是 2-D，则同普通矩阵一样进行矩阵相乘。
    - 如果任意一个矩阵是 n-D，则将其视为带 batch 的二维矩阵乘法。

- 如果原始 Tensor x 或 y 的秩为 1 且未转置，则矩阵相乘后的前置或附加维度 1 将移除。

参数：
    - **x** (Variable) : 输入变量，类型为 Tensor 或 LoDTensor，数据类型为float32， float64，GPU设备下支持float16。
    - **y** (Variable) : 输入变量，类型为 Tensor 或 LoDTensor，数据类型为float32， float64，GPU设备下支持float16。
    - **transpose_x** (bool，可选) : 相乘前是否转置 x，默认值为False。
    - **transpose_y** (bool，可选) : 相乘前是否转置 y，默认值为False。
    - **alpha** (float，可选) : 输出比例，默认为 3.0。
    - **name** （str，可选）- 具体用法请参见 :ref:`api_guide_Name` ，一般无需设置，默认值为None。

返回：
    - Variable (Tensor / LoDTensor)，矩阵相乘后的结，数据类型和输入数据类型一致。

返回类型：
    - Variable（变量）。

::

    * 例 1:

    x: [B, ..., M, K], y: [B, ..., K, N]
    # paddle.matmul(x, y)  # out: [B, ..., M, N]

    * 例 2:

    x: [B, M, K], y: [B, K, N]
    # paddle.matmul(x, y)  # out: [B, M, N]

    * 例 3:

    x: [B, M, K], y: [K, N]
    # paddle.matmul(x, y)  # out: [B, M, N]

    * 例 4:

    x: [M, K], y: [K, N]
    # paddle.matmul(x, y)  # out: [M, N]

    * 例 5:

    x: [B, M, K], y: [K]
    # paddle.matmul(x, y)  # out: [B, M]

    * 例 6:

    x: [K], y: [K]
    # paddle.matmul(x, y)  # out: [1]

    * 例 7:

    x: [M], y: [N]
    # paddle.matmul(x, y, True, True)  # out: [M, N]


**代码示例**：

.. code-block:: python

    import paddle.fluid as fluid
    x = fluid.data(name='x', shape=[2, 3], dtype='float32')
    y = fluid.data(name='y', shape=[3, 2], dtype='float32')
    out = paddle.matmul(x, y, True, True)

