Python 3.x 复数计算误差随着矩阵大小的增加而增大

Python 3.x 复数计算误差随着矩阵大小的增加而增大,python-3.x,precision,complex-numbers,computation,Python 3.x,Precision,Complex Numbers,Computation,如果我有两个小的复数矩阵,即使我手动进行复数乘法(将复数分解为实部和虚部,分别进行乘法),也可以进行复数乘法 但是,如果我的矩阵更大,则通过np.(a,b)和手动相乘得到的结果是不同的 a_shape = (3,500) b_shape = (500,3) # Generating the first complex matrix a np.random.seed(0) a_real = np.random.randn(a_shape[0], a_shape[1]) np.random.see

如果我有两个小的复数矩阵,即使我手动进行复数乘法(将复数分解为实部和虚部,分别进行乘法),也可以进行复数乘法

但是,如果我的矩阵更大,则通过
np.(a,b)
和手动相乘得到的结果是不同的

a_shape = (3,500)
b_shape = (500,3)

# Generating the first complex matrix a
np.random.seed(0)
a_real = np.random.randn(a_shape[0], a_shape[1])
np.random.seed(1)
a_imag = np.random.randn(a_shape[0], a_shape[1])
a = a_real + a_imag*1j

# Generating the second complex matrix b
np.random.seed(2)
b_real = np.random.randn(b_shape[0], b_shape[1])
np.random.seed(3)
b_imag = np.random.randn(b_shape[0], b_shape[1])
b = b_real + b_imag*1j

# 1st approach to do complex multiplication
output1 = np.dot(a,b)
# 2nd approach to do complex multiplication
output_real = np.dot(a.real,b.real) - np.dot(a.imag,b.imag)
np.array_equal(output1.real, output_real)
>>> False
我问这个问题是因为我需要在
pytorch
中做一些复数乘法
pytorch
本机不支持复数,因此我需要手动为real和images组件执行此操作

然后结果比使用
np.dot(a,b)
这个问题有什么解决办法吗

两种计算之间的差异
你没有说差异有多小,但我怀疑你所看到的与复数无关,而是与浮点运算的性质有关

特别是浮点加法不是相联的,也就是说我们不一定有

(a + b) + c = a + (b + c)
这可以解释你所看到的,因为你所做的是比较

Sum{ Ra[i]*Rb[i] - Ia[i]*Ib[i]}

(其中Ra[i]是[i]等的真实部分)


有一件事要试着证明这是个问题,那就是把数字的实部和复杂部分限制在,比如说,整数的十六分之一。对于这样的数字——只要你不加上一个惊人的数字(几十亿),双精度浮点运算将是精确的,因此你应该得到相同的结果。例如,在C语言中,你可以生成一组介于-16和16之间的随机整数,然后用(双精度)数字16.0预测每个整数,得到一个介于-1和1之间的双精度数字,即十六分之一的整数。

很抱歉,我的背景不是计算机科学,我只是偶尔用python做一些科学计算。你能再解释一下“十六分之一的整数”是什么意思吗?基本上是尝试使用双精度数据类型而不是浮点数吗?我的意思是,随机数本身就是浮点数或双精度数,应该是n/16的形式,其中n是介于-16和16之间的整数。恐怕我不知道如何在python中实现这一点(或任何真正的功能)。无论如何,如果你能说出“稍微偏离”的意思,即输出有多大,差异有多大,这将有助于澄清你的问题。我已经添加了两个数组之间的差异。差别其实很小。你知道用其他语言怎么做吗?如果有这方面的代码,我想我能够在python中找到类似的东西。
(a + b) + c = a + (b + c)
Sum{ Ra[i]*Rb[i] - Ia[i]*Ib[i]}
Sum{ Ra[i]*Rb[i]} - Sum{ Ia[i]*Ib[i]}