如何无需逐项计算实现两个等长数组的点积运算?
数组点积的非逐项计算方法
针对给定的数组 a=[1,2,3,4] 和 b=[5,6,7,8],可以通过以下数学恒等式避免逐项相乘求和的形式计算点积:
方法一:利用和的平方展开式
基于代数恒等式:
$(a_i + b_i)^2 = a_i^2 + 2a_i b_i + b_i^2$
对所有元素求和后移项推导,得到点积公式:
sum(a_i * b_i) = [sum((a_i + b_i)²) - sum(a_i²) - sum(b_i²)] / 2
代入示例数组计算:
- 对应元素和的平方和:$(1+5)^2 + (2+6)^2 + (3+7)^2 + (4+8)^2 = 36 + 64 + 100 + 144 = 344$
- 数组a的平方和:$1^2 + 2^2 + 3^2 + 4^2 = 1 + 4 + 9 + 16 = 30$
- 数组b的平方和:$5^2 + 6^2 + 7^2 + 8^2 = 25 + 36 + 49 + 64 = 174$
- 代入公式:$(344 - 30 - 174) / 2 = 140 / 2 = 70$,与逐项计算结果一致。
方法二:利用差的平方展开式
基于代数恒等式:
$(a_i - b_i)^2 = a_i^2 - 2a_i b_i + b_i^2$
移项后得到另一种点积公式:
sum(a_i * b_i) = [sum(a_i²) + sum(b_i²) - sum((a_i - b_i)²)] / 2
代入示例验证:
- 对应元素差的平方和:$(1-5)^2 + (2-6)^2 + (3-7)^2 + (4-8)^2 = 16 + 16 + 16 + 16 = 64$
- 代入公式:$(30 + 174 - 64) / 2 = 140 / 2 = 70$,结果正确。
编程层面的简化实现
如果用Python实现,可借助内置语法或库函数,无需手动写逐项索引的代码:
a = [1,2,3,4] b = [5,6,7,8] # 用zip和生成器表达式简化 dot_product = sum(x*y for x,y in zip(a,b)) # 或用numpy库的dot函数 import numpy as np dot_product = np.dot(a, b)
内容的提问来源于stack exchange,提问作者Arumugam Kannan
相关产品推荐
相关产品推荐

