def adjoint(self):
        """Adjoint of this operator.

        Returns
        -------
        adjoint : `InnerProductOperator` or `MultiplyOperator`
            If the domain of this operator is the scalar field of a
            `LinearSpace` the adjoint is the inner product with ``y``,
            else it is the multiplication with ``y``.

        Examples
        --------
        >>> r3 = odl.rn(3)
        >>> x = r3.element([1, 2, 3])

        Multiply by a space element:

        >>> op = MultiplyOperator(x)
        >>> out = r3.element()
        >>> op.adjoint(x)
        rn(3).element([ 1.,  4.,  9.])

        Multiply scalars with a fixed vector:

        >>> op2 = MultiplyOperator(x, domain=r3.field)
        >>> op2.adjoint(x)
        14.0

        Multiply vectors with a fixed scalar:

        >>> op2 = MultiplyOperator(3.0, domain=r3, range=r3)
        >>> op2.adjoint(x)
        rn(3).element([ 3.,  6.,  9.])

        Multiplication operator with complex space:

        >>> c3 = odl.cn(3)
        >>> x_complex = c3.element([1, 1j, 1-1j])
        >>> op3 = MultiplyOperator(x_complex)
        >>> op3.adjoint.multiplicand
        cn(3).element([ 1.-0.j,  0.-1.j,  1.+1.j])
        """
        if self.__domain_is_field:
            if isinstance(self.domain, RealNumbers):
                return InnerProductOperator(self.multiplicand)
            elif isinstance(self.domain, ComplexNumbers):
                return InnerProductOperator(self.multiplicand.conjugate())
            else:
                raise NotImplementedError(
                    'adjoint not implemented for domain{!r}'
                    ''.format(self.domain))
        elif self.domain.is_complex:
            return MultiplyOperator(np.conj(self.multiplicand),
                                    domain=self.range, range=self.domain)
        else:
            return MultiplyOperator(self.multiplicand,
                                    domain=self.range, range=self.domain)