add(), sub() and mul() in PyTorch
Tags: pytorch, add, sub, mul
Published: 2024-05-07 19:30:41

*[My post](https://dev.to/hyperkai/div-remainder-and-fmod-in-pytorch-1eh1) explains [div()](https://pytorch.org/docs/stable/generated/torch.div.html), [remainder()](https://pytorch.org/docs/stable/generated/torch.remainder.html) and [fmod()](https://pytorch.org/docs/stable/generated/torch.fmod.html).

[add()](https://pytorch.org/docs/stable/generated/torch.add.html) can do addition with two of the 0D or more D tensors of zero or more elements or scalars or the 0D or more D tensor of zero or more elements and a scalar as shown below:

*Memos:
- `add()` can be used with [torch](https://pytorch.org/docs/stable/torch.html) or a tensor.
- The 1st argument with `torch`(`tensor` or `scalar` of `int`, `float`, `complex` or `bool`) or using a tensor(`tensor` of `int`, `float`, `complex` or `bool`) is `input`(Required).
- The 2nd argument with `torch` or the 1st argument with a tensor is `other`(Required-Type:`tensor` or `scalar` of `int`, `float`, `complex` or `bool`).
- The 3rd argument with `torch` or the 2nd argument with a tensor is `alpha`(Optional-Default:`1`-Type:`tensor` or `scalar` of `int`, `float`, `complex` or `bool`). *`other`is multiplied by `alpha`(`input`+(`other`x`alpha`)).
- There is `out` argument with `torch`(Optional-Type:`tensor`):
  *Memos:
  - `out=` must be used.
  - [My post](https://dev.to/hyperkai/set-out-with-out-argument-functions-pytorch-3ee) explains `out` argument.

```python
import torch

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

torch.add(input=tensor1, other=tensor2)
tensor1.add(other=tensor2)
torch.add(input=tensor1, other=tensor2, alpha=1)
torch.add(input=tensor1, other=tensor2, alpha=torch.tensor(1))
# tensor([[13, 3, 9], [7, 12, 1]])

torch.add(input=tensor1, other=tensor2, alpha=0)
torch.add(input=tensor1, other=tensor2, alpha=torch.tensor(0))
# tensor([[9, 7, 6], [9, 7, 6]])

torch.add(input=tensor1, other=tensor2, alpha=2)
torch.add(input=tensor1, other=tensor2, alpha=torch.tensor(2))
# tensor([[17, -1, 12], [5, 17, -4]])

torch.add(input=tensor1, other=tensor2, alpha=-1)
torch.add(input=tensor1, other=tensor2, alpha=torch.tensor(-1))
# tensor([[5, 11, 3], [11, 2, 11]])

torch.add(input=tensor1, other=tensor2, alpha=-2)
torch.add(input=tensor1, other=tensor2, alpha=torch.tensor(-2))
# tensor([[1, 15, 0], [13, -3, 16]])

torch.add(input=9, other=tensor2)
torch.add(input=9, other=tensor2, alpha=1)
torch.add(input=9, other=tensor2, alpha=torch.tensor(1))
# tensor([[13, 5, 12], [7, 14, 4]])

torch.add(input=tensor1, other=4)
torch.add(input=tensor1, other=4, alpha=1)
torch.add(input=tensor1, other=4, alpha=torch.tensor(1))
# tensor([13, 11, 10])

torch.add(input=9, other=4)
torch.add(input=9, other=4, alpha=1)
torch.add(input=9, other=4, alpha=torch.tensor(1))
# tensor(13)

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

torch.add(input=tensor1, other=tensor2)
torch.add(input=tensor1, other=tensor2, alpha=1.)
torch.add(input=tensor1, other=tensor2, alpha=torch.tensor(1.))
# tensor([[13., 3., 9.], [7., 12., 1.]])

torch.add(input=9., other=tensor2)
torch.add(input=9., other=tensor2, alpha=1.)
torch.add(input=9., other=tensor2, alpha=torch.tensor(1.))
# tensor([[13., 5., 12.], [7., 14., 4.]])

torch.add(input=tensor1, other=4.)
torch.add(input=tensor1, other=4., alpha=1.)
torch.add(input=tensor1, other=4., alpha=torch.tensor(1.))
# tensor([13., 11., 10.])

torch.add(input=9., other=4.)
torch.add(input=9., other=4., alpha=1.)
torch.add(input=9., other=4., alpha=torch.tensor(1.))
# tensor(13.)

tensor1 = torch.tensor([9.+0.j, 7.+0.j, 6.+0.j])
tensor2 = torch.tensor([[4.+0.j, -4.+0.j, 3.+0.j],
                        [-2.+0.j, 5.+0.j, -5.+0.j]])
torch.add(input=tensor1, other=tensor2)
torch.add(input=tensor1, other=tensor2, alpha=1.+0.j)
torch.add(input=tensor1, other=tensor2, alpha=torch.tensor(1.+0.j))
# tensor([[13.+0.j, 3.+0.j, 9.+0.j],
#         [7.+0.j, 12.+0.j, 1.+0.j]])

torch.add(input=9.+0.j, other=tensor2)
torch.add(input=9.+0.j, other=tensor2, alpha=1.+0.j)
torch.add(input=9.+0.j, other=tensor2, alpha=torch.tensor(1.+0.j))
# tensor([[13.+0.j, 5.+0.j, 12.+0.j],
#         [7.+0.j, 14.+0.j, 4.+0.j]])

torch.add(input=tensor1, other=4.+0.j)
torch.add(input=tensor1, other=4.+0.j, alpha=1.+0.j)
torch.add(input=tensor1, other=4.+0.j, alpha=torch.tensor(1.+0.j))
# tensor([13.+0.j, 11.+0.j, 10.+0.j])

torch.add(input=9.+0.j, other=4.+0.j)
torch.add(input=9.+0.j, other=4.+0.j, alpha=1.+0.j)
torch.add(input=9.+0.j, other=4.+0.j, alpha=torch.tensor(1.+0.j))
# tensor(13.+0.j)

tensor1 = torch.tensor([True, False, True])
tensor2 = torch.tensor([[False, True, False], [True, False, True]])

torch.add(input=tensor1, other=tensor2)
torch.add(input=tensor1, other=tensor2, alpha=True)
torch.add(input=tensor1, other=tensor2, alpha=torch.tensor(True))
# tensor([[True, True, True], [True, False, True]])

torch.add(input=True, other=tensor2)
torch.add(input=True, other=tensor2, alpha=True)
torch.add(input=True, other=tensor2, alpha=torch.tensor(True))
# tensor([[True, True, True], [True, True, True]])

torch.add(input=tensor1, other=False)
torch.add(input=tensor1, other=False, alpha=True)
torch.add(input=tensor1, other=False, alpha=torch.tensor(True))
# tensor([True, False, True])

torch.add(input=True, other=False)
torch.add(input=True, other=False, alpha=True)
torch.add(input=True, other=False, alpha=torch.tensor(True))
# tensor(True)
```

[sub()](https://pytorch.org/docs/stable/generated/torch.sub.html) can do subtraction with two of the 0D or more D tensors of zero or more elements or scalars or the 0D or more D tensor of zero or more elements and a scalar, getting the 0D or more D tensor of zero or more elements as shown below:

*Memos:
- `sub()` can be used with `torch` or a tensor.
- The 1st argument with `torch`(`tensor` or `scalar` of `int`, `float` or `complex`) or using a tensor(`tensor` of `int`, `float` or `complex`) is `input`(Required).
- The 2nd argument with `torch` or the 1st argument with a tensor is `other`(Required-Type:`tensor` or `scalar` of `int`, `float` or `complex`).
- The 3rd argument with `torch` or the 2nd argument with a tensor is `alpha`(Optional-Default:`1`-Type:`tensor` or `scalar` of `int`, `float` or `complex`). *`other`is multiplied by `alpha`(`input`-(`other`x`alpha`)).
- There is `out` argument with `torch`(Optional-Type:`tensor`):
  *Memos:
  - `out=` must be used.
  - [My post](https://dev.to/hyperkai/set-out-with-out-argument-functions-pytorch-3ee) explains `out` argument.
- [subtract()](https://pytorch.org/docs/stable/generated/torch.subtract.html) is the alias of `sub()`.

```python
import torch

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

torch.sub(input=tensor1, other=tensor2)
tensor1.sub(other=tensor2)
torch.sub(input=tensor1, other=tensor2, alpha=1)
torch.sub(input=tensor1, other=tensor2, alpha=torch.tensor(1))
# tensor([[5, 11, 3], [11, 2, 11]])

torch.sub(input=tensor1, other=tensor2, alpha=0)
torch.sub(input=tensor1, other=tensor2, alpha=torch.tensor(0))
# tensor([[9, 7, 6], [9, 7, 6]])

torch.sub(input=tensor1, other=tensor2, alpha=2)
torch.sub(input=tensor1, other=tensor2, alpha=torch.tensor(2))
# tensor([[1, 15, 0], [13, -3, 16]])

torch.sub(input=tensor1, other=tensor2, alpha=-1)
torch.sub(input=tensor1, other=tensor2, alpha=torch.tensor(-1))
# tensor([[13, 3, 9], [7, 12, 1]])

torch.sub(input=tensor1, other=tensor2, alpha=-2)
torch.sub(input=tensor1, other=tensor2, alpha=torch.tensor(-2))
# tensor([[17, -1, 12], [5, 17, -4]])

torch.sub(input=9, other=tensor2)
torch.sub(input=9, other=tensor2, alpha=1)
torch.sub(input=9, other=tensor2, alpha=torch.tensor(1))
# tensor([[5, 13, 6], [11, 4, 14]])

torch.sub(input=tensor1, other=4)
torch.sub(input=tensor1, other=4, alpha=1)
torch.sub(input=tensor1, other=4, alpha=torch.tensor(1))
# tensor([5, 3, 2])

torch.sub(input=9, other=4)
torch.sub(input=9, other=4, alpha=1)
torch.sub(input=9, other=4, alpha=torch.tensor(1))
# tensor(5)

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

torch.sub(input=tensor1, other=tensor2)
torch.sub(input=tensor1, other=tensor2, alpha=1.)
torch.sub(input=tensor1, other=tensor2, alpha=torch.tensor(1.))
# tensor([[5., 11., 3.], [11., 2., 11.]])

torch.sub(input=9., other=tensor2)
torch.sub(input=9., other=tensor2, alpha=1.)
torch.sub(input=9., other=tensor2, alpha=torch.tensor(1.))
# tensor([[5., 13., 6.], [11., 4., 14.]])

torch.sub(input=tensor1, other=4)
torch.sub(input=tensor1, other=4, alpha=1.)
torch.sub(input=tensor1, other=4, alpha=torch.tensor(1.))
# tensor([5., 3., 2.])

torch.sub(input=9., other=4)
torch.sub(input=9., other=4, alpha=1.)
torch.sub(input=9., other=4, alpha=torch.tensor(1.))
# tensor(5.)

tensor1 = torch.tensor([9.+0.j, 7.+0.j, 6.+0.j])
tensor2 = torch.tensor([[4.+0.j, -4.+0.j, 3.+0.j],
                        [-2.+0.j, 5.+0.j, -5.+0.j]])
torch.sub(input=tensor1, other=tensor2)
torch.sub(input=tensor1, other=tensor2, alpha=1.+0.j)
torch.sub(input=tensor1, other=tensor2, alpha=torch.tensor(1.+0.j))
# tensor([[5.+0.j, 11.+0.j, 3.+0.j],
#         [11.+0.j, 2.+0.j, 11.+0.j]])

torch.sub(input=9.+0.j, other=tensor2)
torch.sub(input=9.+0.j, other=tensor2, alpha=1.+0.j)
torch.sub(input=9.+0.j, other=tensor2, alpha=torch.tensor(1.+0.j))
# tensor([[5.+0.j, 13.+0.j, 6.+0.j],
#         [11.+0.j, 4.+0.j, 14.+0.j]])

torch.sub(input=tensor1, other=4.+0.j)
torch.sub(input=tensor1, other=4.+0.j, alpha=1.+0.j)
torch.sub(input=tensor1, other=4.+0.j, alpha=torch.tensor(1.+0.j))
# tensor([5.+0.j, 3.+0.j, 2.+0.j])

torch.sub(input=9.+0.j, other=4.+0.j)
torch.sub(input=9.+0.j, other=4.+0.j, alpha=1+0j)
torch.sub(input=9.+0.j, other=4.+0.j, alpha=torch.tensor(1+0j))
# tensor(5.+0.j)
```

[mul()](https://pytorch.org/docs/stable/generated/torch.mul.html) can do multiplication with two of the 0D or more D tensors of zero or more elements or scalars or the 0D or more D tensor of zero or more elements and a scalar. getting the 0D or more D tensor of zero or more elements as shown below:

*Memos:
- `mul()` can be used with `torch` or a tensor.
- The 1st argument with `torch`(`tensor` or `scalar` of `int`, `float`, `complex` or `bool`) or using a tensor(`tensor` of `int`, `float`, `complex` or `bool`) is `input`(Required).
- The 2nd argument with `torch` or the 1st argument with a tensor is `other`(Required-Type:`tensor` or `scalar` of `int`, `float`, `complex` or `bool`).
- There is `out` argument with `torch`(Optional-Type:`tensor`):
  *Memos:
  - `out=` must be used.
  - [My post](https://dev.to/hyperkai/set-out-with-out-argument-functions-pytorch-3ee) explains `out` argument.
- [multiply()](https://pytorch.org/docs/stable/generated/torch.multiply.html) is the alias of `mul()`.

```python
import torch

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

torch.mul(input=tensor1, other=tensor2)
tensor1.mul(other=tensor2)
# tensor([[36, -28, 18], [-18, 35, -30]])

torch.mul(input=9, other=tensor2)
# tensor([[36, -36, 27], [-18, 45, -45]])

torch.mul(input=tensor1, other=4)
# tensor([36, 28, 24])

torch.mul(input=9, other=4)
# tensor(36)

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

torch.mul(input=tensor1, other=tensor2)
# tensor([[36., -28., 18.], [-18., 35., -30.]])

torch.mul(input=9., other=tensor2)
# tensor([[36., -36., 27.], [-18., 45., -45.]])

torch.mul(input=tensor1, other=4.)
# tensor([36., 28., 24.])

torch.mul(input=9., other=4.)
# tensor(36.)

tensor1 = torch.tensor([9.+0.j, 7.+0.j, 6.+0.j])
tensor2 = torch.tensor([[4.+0.j, -4.+0.j, 3.+0.j],
                        [-2.+0.j, 5.+0.j, -5.+0.j]])
torch.mul(input=tensor1, other=tensor2)
# tensor([[36.+0.j, -28.+0.j, 18.+0.j],
#         [-18.+0.j, 35.+0.j, -30.+0.j]])

torch.mul(input=9.+0.j, other=tensor2)
# tensor([[36.+0.j, -36.+0.j, 27.+0.j],
#         [-18.+0.j, 45.+0.j, -45.+0.j]])

torch.mul(input=tensor1, other=4.+0.j)
# tensor([36.+0.j, 28.+0.j, 24.+0.j])

torch.mul(input=9.+0.j, other=4.+0.j)
# tensor(36.+0.j)

tensor1 = torch.tensor([True, False, True])
tensor2 = torch.tensor([[False, True, False], [True, False, True]])

torch.mul(input=tensor1, other=tensor2)
# tensor([[False, False, False],
#         [True, False, True]])

torch.mul(input=True, other=tensor2)
# tensor([[False, True, False], [True, False, True]])

torch.mul(input=tensor1, other=False)
# tensor([False, False, False])

torch.mul(input=True, other=False)
# tensor(False)
```