好的,这个问题可能有一个非常简单的答案,但我已经搜索了相当长的时间,没有找到...
我想在复平面空间中获得2个复数的点积。然而,np.dot和np.vdot都给出了错误的结果。
我想要做的示例:
a = 1+1j
b = 1-1j
dot(a,b) == 0
我真正得到的是什么:
np.dot(a,b) == 2+0j
np.vdot(a,b) == 0-2j
np.conj(a)*b == 0-2j
我可以使用这个相当笨拙的表达方式来获得我想要的东西。
a.real*b.real + a.imag*b.imag
但是我很惊讶没有找到一个好的ufunc来完成这个任务。它不存在吗?我没想到要编写自己的ufunc来向量化这样一个常见操作。
我的担忧之一是,看起来我的表达式在提取实部/虚部时做了很多额外的工作,而它们应该已经在相邻的内存位置中(考虑到a、b实际上已经结合在像complex64这样的数据类型中)。这可能会导致非常严重的减速。
** 编辑
最终,我使用Numba定义了一个ufunc:
@vectorize
def cdot(a, b):
return (a.real*b.real + a.imag*b.imag)
这使我能够正确地关联复杂的数据。以下是一张相关性图像,供帮助我的人们参考!
(1 + 1j) * (1 - 1j) == 2
,而不是0
。 - Gorisanson