A useful method for both transforming probabilities and differential equations to something useful.
Start here: A nice video from 3 blue 1 brown
The remainder are sloppy notes that require more love than I can provide today.
In signal processing, multidimensional discrete convolution refers to the mathematical operation between two functions f and g on an n-dimensional lattice that produces a third function, also of n-dimensions. Multidimensional discrete convolution is the discrete analog of the multidimensional convolution of functions on Euclidean space. wiki
If a
and b
are two lists, then the convolution of a
and b
are:
$$
(a * b) = \sum_{i=1}^{n} a_i \cdot b_{n-1}
$$
Note that b
is reversed, as the convolution calculates the diagonal sum of the cartesion product.
Example:
$$ (1,2,3)* (4,5,6) = (1*4, 2*4+1*5, 3*4+2*5+1*6, 3*5+2*6, 3*6) = (4,13,28,27,18) $$This method of using convolve is particularly useful when multiplying two polynomials:
$$ (1+2x+3x^2)(4+5x+6x2) = 4+ 13x + 28x^2 + 27x^3 + 18x^4 $$The application of convolutions is straight forward, thanks to numpy
and scipy.signal
import numpy as np
import scipy.signal
arr1 = np.random.random(10000)
arr2 = np.random.random(10000)
%%timeit
one = np.convolve(arr1, arr2)
12.7 ms ± 153 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit
two = scipy.signal.fftconvolve(arr1,arr2) # Uses fast fourier transformation.
385 µs ± 2.52 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
one = np.convolve(arr1, arr2)
one
array([0.50463307, 0.44964624, 0.92836526, ..., 0.34637847, 0.43631255, 0.15162397])
two = scipy.signal.fftconvolve(arr1,arr2)
two
array([0.50463307, 0.44964624, 0.92836526, ..., 0.34637847, 0.43631255, 0.15162397])
np.allclose(one,two) # test if same shape, elements have close enough values
True