2014-03-28 94 views
0

我想使用qmath,一个四元数的库。qmath很奇怪AttributeError

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

给了我这样的回溯

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' 

但在文档他们说,这必须工作:

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() 

这是什么?

+0

顺便说一句,有没有人知道一个很好的四元数python库?我已经尝试过'qmath'(见问题),'Quaternion'(不能用非标准化的Qs)和'euclid',它在依赖关系中有很重的scipy,但不能乘以Qs和vector,而'quaternionarray'甚至没有进口。这真是难过;这真是伤心。 – akaRem

+0

这个'qmath.quaternion(np.float64(1))'产生相同的错误。 'qmath.quaternion(np.float(1))'工作正常。我怀疑'qmath'写了2年后'numpy'的变化。 – hpaulj

回答

0

qmathcore.py以较新的(1.9)numpy未通过自己的doctest测试。

添加此测试quatereon()

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

允许qmath.quaternion([1,2,3,4]).imag()(和conj)。

quaternion方法使用了很多type(q)==xxx测试。 isinstance()是一个更强大的测试。它也以else:pass结尾,因此不会捕获它无法处理的值q

纠正一些导入错误后,qmathcore doctest运行良好。

+0

林不知道这是答案,但接受。在我的项目中,我实现了自己的四元数代数。但仍......非常感谢您的回答! – akaRem

+0

我一直在看'qmath'多一些。这个数学似乎没问题,但是对Python类的处理,特别是对“quaternion”的子类化处理是粗糙的。重点似乎是处理各种输入格式,而不是为进一步计算提供有用的信息。 – hpaulj