Numpy dot乘积与手动矩阵乘法结果存差异,求原因
复数矩阵乘法结果差异的原因分析
问题重现
尝试对两个复数矩阵做乘法,分别用numpy.dot和手动计算实现,结果出现微小差异:
numpy实现代码
import numpy as np a = [[0.8730616+0j, 0.8133501+0.3224322j], [0.8133501-0.3224322j, 0.87694746+0j]] g = [[0.70813084+0j, 0.6563272+0.26035604j],[-0.6563272+0.26035604j, 0.70813084+0j]] a_temp1 = np.dot(a, g)
手动计算代码
import numpy as np a = [[0.8730616+0j, 0.8133501+0.3224322j], [0.8133501-0.3224322j, 0.87694746+0j]] g = [[0.70813084+0j, 0.6563272+0.26035604j],[-0.6563272+0.26035604j, 0.70813084+0j]] a_temp2 = np.zeros((2, 2)) a_temp2[0,0] = a[0,0]*g[0,0] + a[0,1]*g[1,0] a_temp2[0,1] = a[0,0]*g[0,1] + a[0,1]*g[1,1] a_temp2[1,0] = a[1,0]*g[0,0] + a[1,1]*g[1,0] a_temp2[1,1] = a[1,0]*g[0,1] + a[1,1]*g[1,1]
结果差异示例
a_temp1[0,0] = 0.0004709065+0.00013959408j a_temp2[0,0] = 0.0004708767+0.00013959408j
差异原因
- 浮点数精度的固有局限:计算机用二进制浮点数存储实数,大部分十进制小数无法被精确表示,运算过程中会产生微小的舍入误差。复数的实部和虚部分别遵循这一规则,累加、乘法步骤的误差会逐步累积。
- 运算实现的细节差异:
numpy.dot依赖底层优化的线性代数库(如BLAS/LAPACK),这些库会采用更高效的运算顺序、寄存器优化或并行计算策略,与手动计算的逐元素累加顺序不同,导致最终舍入结果出现细微差别。 - 数据处理逻辑的细微区别:手动计算时使用Python原生复数类型,而
numpy.dot会先将列表转换为numpy复数数组(默认np.complex128),两种环境下中间结果的存储、运算逻辑细节存在差异,进一步放大了微小的精度误差。
内容的提问来源于stack exchange,提问作者Sumeer
相关产品推荐
相关产品推荐

