DEV Community

Super Kai (Kazuya Ito)
Super Kai (Kazuya Ito)

Posted on • Edited on

Dot and Matrix-vector multiplication in PyTorch

Buy Me a Coffee

*Memos:

  • My post explains Matrix and Element-wise multiplication in PyTorch.
  • My post explains the functions and operators for Dot and Matrix multiplication and Element-wise calculation in PyTorch.

<Dot multiplication(product)>

  • Dot multiplication is the multiplication of 1D tensors(arrays).
  • The rule which you must follow to do dot multiplication is the number of the rows of A and B tensor(array) must be 1 and the number of the columns must be the same.
   <A>         <B>
[a, b, c] x [d, e, f] = ad+be+cf
1 row       1 row
3 columns   3 columns

[2, -7, 4] x [-5, 0, 8] = 22
                     2x(-5)-7x0+4x8
  [2, -7, 4]
   x   x  x
 [-5,  0, 8]
      ||
 [-10, 0, 32]
   -10+0+32
      ||
      22
Enter fullscreen mode Exit fullscreen mode

In PyTorch with dot(), matmul() or @:

*Memos:

  • dot() can do dot multiplication with two of 1D tensors.
  • matmul() or @ can do dot, matrix-vector or matrix multiplication with two of 1D or more D tensors.
import torch

tensor1 = torch.tensor([2, -7, 4])
tensor2 = torch.tensor([-5, 0, 8])

torch.dot(input=tensor1, tensor=tensor2)
tensor1.dot(tensor=tensor2)
torch.matmul(input=tensor1, other=tensor2)
tensor1.matmul(other=tensor2)
tensor1 @ tensor2
# tensor(22)
Enter fullscreen mode Exit fullscreen mode

In NumPy with dot(), matmul() or @:

*Memos:

  • dot() can do dot, matrix-vector or matrix multiplication with two of 0D or more D arrays. *dot() is basically used to multiply 1D arrays.
  • matmul() or @ can do dot, matrix-vector or matrix multiplication with two of 1D or more D arrays.
import numpy

array1 = numpy.array([2, -7, 4])
array2 = numpy.array([-5, 0, 8])

numpy.dot(array1, array2)
array1.dot(array2)
numpy.matmul(array1, array2)
array1 @ array2
# 22
Enter fullscreen mode Exit fullscreen mode

<Matrix-vector multiplication(product)>

  • Matrix-vector multiplication is the multiplication of a 2D or more D tensor(array) and 1D tensor(array). *The order must be a 2D or more D tensor and 1D tensor but not a 1D tensor and 2D or more D tensor(array).
  • The rule which you must follow to do matrix-vector multiplication is the number of the columns of A and B tensor(array) must be the same.

A 2D and 1D tensor(array):

    <A>          <B>
[[a, b, c], [d, e, f]] x [g, h, i] = [ag+bh+ci, dg+eh+fi]
2 rows                   1 row
(3) columns              (3) columns

[[2, -7, 4], [6, 3, -1]] x [-5, 0, 8] = [22, -38]
                            [2x(-5)-7x0+4x8, 6x(-5)+3x0-1x8]
 [[2, -7, 4], [6, 3, -1]]
   x   x  x    x  x   x
 [-5,  0, 8] [-5, 0,  8]
      ||          ||
[-10, 0, 32] [-30, 0, -8]
  -10+0+32     -30+0-8
      ||          ||
     [22,        -38]
Enter fullscreen mode Exit fullscreen mode

In PyTorch with matmul(), mv() or @. *mv() can do matrix-vector multiplication with a 2D tensor and 1D tensor:

import torch

tensor1 = torch.tensor([[2, -7, 4], [6, 3, -1]])
tensor2 = torch.tensor([-5, 0, 8])

torch.matmul(input=tensor1, other=tensor2)
tensor1.matmul(other=tensor2)
torch.mv(input=tensor1, vec=tensor2)
tensor1.mv(vec=tensor2)
tensor1 @ tensor2
# tensor([22, -38])
Enter fullscreen mode Exit fullscreen mode

In NumPy with dot(), matmul() or @:

import numpy

array1 = numpy.array([[2, -7, 4], [6, 3, -1]])
array2 = numpy.array([-5, 0, 8])

numpy.dot(array1, array2)
array1.dot(array2)
numpy.matmul(array1, array2)
array1 @ array2
# array([22, -38])
Enter fullscreen mode Exit fullscreen mode

A 3D and 1D tensor(array):

*The 3D tensor(array) of A has three of 2D tensors(arrays) which have 2 rows and 3 columns each.

     <A>                      <B>
[[[a, b, c], [d, e, f]], x [s, t, u] = [[[as+bt+cu, ds+et+fu]],
 [[g, h, i], [j, k, l]],                [[gs+ht+iu, js+kt+lu]],
 [[m, n, o], [p, q, r]]]                [[ms+nt+ou, ps+qt+ru]]]
2 rows                     1 row
(3) columns                (3) columns

[[[2, -7, 4], [6, 3, -1]] x [-5, 0, 8] = [[22, -38],
 [[-4, 9, 0], [5, 8, -2]],                [20, -41],
 [[-6, 7, 1], [0, -9, 5]]]                [38, 40]])
                             [[2x(-5)-7x0+4x8, 6x(-5)+3x0-1x8],
                              [-4x(-5)+9x0+0x8, 5x(-5)+8x0-2x8],
                              [-6x(-5)+7x0+1x8, 0x(-5)-9x0+5x8]]
Enter fullscreen mode Exit fullscreen mode

In PyTorch with matmul() or @:

import torch

tensor1 = torch.tensor([[[2, -7, 4], [6, 3, -1]],
                        [[-4, 9, 0], [5, 8, -2]],
                        [[-6, 7, 1], [0, -9, 5]]])
tensor2 = torch.tensor([-5, 0, 8])

torch.matmul(input=tensor1, other=tensor2)
tensor1.matmul(other=tensor2)
tensor1 @ tensor2
# tensor([[22, -38],
#         [20, -41],
#         [38, 40]])
Enter fullscreen mode Exit fullscreen mode

In NumPy with dot(), matmul() or @:

import numpy

array1 = numpy.array([[[2, -7, 4], [6, 3, -1]],
                      [[-4, 9, 0], [5, 8, -2]],
                      [[-6, 7, 1], [0, -9, 5]]])
array2 = numpy.array([-5, 0, 8])

numpy.dot(array1, array2)
array1.dot(array2)
numpy.matmul(array1, array2)
array1 @ array2
# array([[22, -38],
#        [20, -41],
#        [38, 40]])
Enter fullscreen mode Exit fullscreen mode

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

Top comments (0)

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay