def METHOD_NAME(self, x: NDArray) -> NDArray:
    ncp = get_array_module(x)
    x = x.squeeze()
    if self.usematmul:
        if self.nz == 1:
            x = x[..., ncp.newaxis]
        if hasattr(self, "GT"):
            y = ncp.matmul(self.GT, x)
        else:
            # y = ncp.matmul(self.G.transpose((0, 2, 1)).conj(), x)
            y = (
                ncp.matmul(x.transpose(0, 2, 1).conj(), self.G)
                .transpose(0, 2, 1)
                .conj()
            )
    else:
        y = ncp.squeeze(ncp.zeros((self.nsl, self.ny, self.nz), dtype=self.dtype))
        if hasattr(self, "GT"):
            for isl in range(self.nsl):
                y[isl] = ncp.dot(self.GT[isl], x[isl])
        else:
            for isl in range(self.nsl):
                # y[isl] = ncp.dot(self.G[isl].conj().T, x[isl])
                y[isl] = ncp.dot(x[isl].T.conj(), self.G[isl]).T.conj()
    return y.ravel()