maxframe.tensor.matmul#

maxframe.tensor.matmul(a, b, sparse=None, out=None, **kw)[源代码]#

两个张量的矩阵乘积。

其行为取决于参数,具体如下。

  • 如果两个参数都是二维的,则按照常规矩阵方式相乘。

  • 如果任一参数是 N 维(N > 2),则将其视为驻留在最后两个索引中的矩阵堆栈,并据此进行广播。

  • 如果第一个参数是一维的,则通过在其维度前添加一个 1 将其提升为矩阵。矩阵乘法后,添加的 1 会被移除。

  • 如果第二个参数是一维的,则通过在其维度后添加一个 1 将其提升为矩阵。矩阵乘法后,添加的 1 会被移除。

不允许与标量相乘,请改用 *。注意,将矩阵堆栈与向量相乘会得到向量堆栈,但 matmul 不会将其识别为向量堆栈。

matmuldot 在两个重要方面有所不同。

  • 不允许与标量相乘。

  • 矩阵堆栈将像元素一样进行广播。

参数:
  • a (array_like) -- 第一个参数。

  • b (array_like) -- 第二个参数。

  • out (Tensor, optional) -- 输出参数。它必须具有未使用时将返回的确切类型。特别是,它必须具有正确的类型,且其 dtype 必须是 dot(a,b) 将返回的 dtype。这是一个性能特性。因此,如果这些条件未满足,将引发异常,而不是尝试灵活处理。

返回:

output -- 返回 ab 的点积。如果 ab 都是一维数组,则返回一个标量;否则返回一个数组。如果提供了 out,则返回 out

返回类型:

Tensor

抛出:

ValueError -- 如果 a 的最后一维与 b 的倒数第二维大小不同。如果传入了标量值。

参见

vdot

复共轭点积。

tensordot

在任意轴上求和。

dot

具有不同广播规则的替代矩阵乘积。

备注

matmul 函数实现了在 Python 3.5 中根据 PEP465 引入的 @ 运算符的语义。

示例

对于二维数组,它是矩阵乘积:

>>> import maxframe.tensor as mt
>>> a = [[1, 0], [0, 1]]
>>> b = [[4, 1], [2, 2]]
>>> mt.matmul(a, b).execute()
array([[4, 1],
       [2, 2]])

对于二维与一维混合,结果是常规的。

>>> a = [[1, 0], [0, 1]]
>>> b = [1, 2]
>>> mt.matmul(a, b).execute()
array([1, 2])
>>> mt.matmul(b, a).execute()
array([1, 2])

广播对于数组堆栈是常规的

>>> a = mt.arange(2*2*4).reshape((2,2,4))
>>> b = mt.arange(2*2*4).reshape((2,4,2))
>>> mt.matmul(a,b).shape
(2, 2, 2)
>>> mt.matmul(a,b)[0,1,1].execute()
98
>>> mt.sum(a[0,1,:] * b[0,:,1]).execute()
98

向量,向量返回标量内积,但两个参数都不进行复共轭:

>>> mt.matmul([2j, 3j], [2j, 3j]).execute()
(-13+0j)

标量乘法会引发错误。

>>> mt.matmul([1,2], 3)
Traceback (most recent call last):
...
ValueError: Scalar operands are not allowed, use '*' instead