pylops icon indicating copy to clipboard operation
pylops copied to clipboard

Linear operator for Fast Welsh-Hadamard Transform

Open SilentEch0 opened this issue 4 years ago • 3 comments

Can be implemented using SymPy

SilentEch0 avatar Oct 12 '21 15:10 SilentEch0

Interesting idea :) I wasn’t aware of this transform being available in sympy.

Just to be sure, I thought sympy works only with symbolic math, can this transform operate on numpy arrays too?

mrava87 avatar Oct 12 '21 19:10 mrava87

came across this... image

but looking at sympy's implementation of FWHT, we can implement it in pylops...

def _walsh_hadamard_transform(seq, inverse=False):
    """Utility function for the Walsh Hadamard Transform"""

    if not iterable(seq):
        raise TypeError("Expected a sequence of coefficients "
                        "for Walsh Hadamard Transform")

    a = [sympify(arg) for arg in seq]
    n = len(a)
    if n < 2:
        return a

    if n&(n - 1):
        n = 2**n.bit_length()

    a += [S.Zero]*(n - len(a))
    h = 2
    while h <= n:
        hf = h // 2
        for i in range(0, n, h):
            for j in range(hf):
                u, v = a[i + j], a[i + j + hf]
                a[i + j], a[i + j + hf] = u + v, u - v
        h *= 2

    if inverse:
        a = [x/n for x in a]

    return a

dikwickley avatar Feb 01 '23 14:02 dikwickley

I wasn’t really sure what @SilentEch0 meant and he never replied. I wouldn’t give priority to this issue unless it’s clear what is its value

mrava87 avatar Feb 01 '23 14:02 mrava87