Question

I'm trying to use qmath, a quaternion lib.

this

from qmath import  qmathcore
a = qmathcore.quaternion([1,2,3,4])
print a.conj()

gives me such traceback

Traceback (most recent call last):
  File "*******/q_test.py", line 25, in <module>
    print str(a.conj())
  File "*******/venv/lib/python2.7/site-packages/qmath/qmathcore.py", line 788, in conj
    return self.real() - self.imag()
  File "*******/venv/lib/python2.7/site-packages/qmath/qmathcore.py", line 762, in imag
    return self - self.real()      
  File "*******/venv/lib/python2.7/site-packages/qmath/qmathcore.py", line 522, in __sub__
    self -= other
  File "*******/venv/lib/python2.7/site-packages/qmath/qmathcore.py", line 407, in __isub__
    self.other = quaternion(other)
  File "*******/venv/lib/python2.7/site-packages/qmath/qmathcore.py", line 81, in __init__
    self.q = q.q
AttributeError: quaternion instance has no attribute 'q'

but in docs they said, that this must work:

def conj(self):
    """
    Returns the conjugate of the quaternion
    >>> import qmathcore
    >>> a = qmathcore.quaternion([1,2,3,4])
    >>> a.conj()
    (1.0-2.0i-3.0j-4.0k)
    >>> a = qmathcore.hurwitz([1,2,3,4])
    >>> a.conj()
    (1-2i-3j-4k)
    """
    return self.real() - self.imag()

what is this?

Was it helpful?

Solution

qmathcore.py fails its own doctest with a newer (1.9) numpy.

Adding this test to quatereon()

    elif isinstance(q,float) or isinstance(q,int): # accept np.float64
        self.q = 1.0 * np.array([q,0.,0.,0.])

allows qmath.quaternion([1,2,3,4]).imag() (and conj).

The quaternion method is using a lot of type(q)==xxx tests. isinstance() is a more robust test. Also it ends with a else:pass, and thus doesn't catch q values that it can't handle.

After correcting some import errors, the qmathcore doctest runs fine.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top