Quiero una función de convolución circular donde pueda establecer el número N
como quiera.
Todos los ejemplos que miré aquí y aquí asumen que se requiere relleno completo, pero eso no es lo que quiero.
Quiero tener el resultado para diferentes valores de N
N
y y dos matrices diferentes de valores Aquí está la fórmula para la convolución circular. Sub N
puede verse como la operación de módulo.
Esta respuesta es una solución adecuada cuando la matriz a
se apila de acuerdo con los diferentes casos de N
.
Cuando encuentre tiempo, publicaré una respuesta completa, mientras tanto, siéntase libre de hacerlo.
¡Gracias a @André por señalar esto en los comentarios!
Creo que esto debería funcionar:
def conv(x1, x2, N): n, m = np.ogrid[:N, :N] return (x1[:N] * x2[(n - m) % N]).sum(axis=1)
Esta es una traducción directa de la fórmula publicada en la pregunta:
Para implementar esta fórmula, primero calculamos una matriz de índices utilizados por x₂. Esto se hace usando el código
n, m = np.ogrid[:N, :N] indices = (n - m) % N
Por ejemplo, para N=5
, los indices
de la matriz son:
[[0 4 3 2 1] [1 0 4 3 2] [2 1 0 4 3] [3 2 1 0 4] [4 3 2 1 0]]
La entrada en la fila i-ésima y la columna j-ésima es (ij) % N
. Luego, x2[indices]
crea una matriz que consta de elementos de x2
correspondientes a estos índices. Resta multiplicar cada fila de este arreglo por los primeros N
elementos de x1
y sacar la suma de cada fila:
(x1[:N] * x2[indices]).sum(axis=1)