如何计算每个qm对应的max_{ui,uj∈U}|qm^T(ui-uj)|最大值?
问题解决方案
首先,你要计算的max_{ui,uj∈U}|qm^T(ui-uj)|可以通过数学简化避免生成所有ui-uj组合:
- 展开点积可得:
qm^T(ui-uj) = qm·ui - qm·uj - 这个差值的绝对值的最大值,等于
max(qm·ui) - min(qm·ui)(因为最大点积减最小点积的结果是非负的,绝对值可直接省略)
实现代码
import numpy as np n = 300 u1 = np.random.uniform(0.5, 4.5, size=n) u2 = 2 / u1 + np.random.normal(scale=0.09, size=n) u = np.array([u1, u2]) # 形状 (2, 300) d = np.random.uniform(0.0, np.pi, size=100) q = np.array([np.cos(d), np.sin(d)]) # 形状 (2, 100) # 计算每个qm与所有ui的点积,得到(100, 300)的数组,每行对应一个qm的点积结果 dot_products = q.T @ u # 对每个qm对应的点积数组,取最大值减最小值,得到最终结果 results = np.max(dot_products, axis=1) - np.min(dot_products, axis=1) # 输出结果形状,确认是100个元素对应m=1到100 print(results.shape) # 输出 (100,)
错误原因说明
你之前使用的u-u是数组自身相减,得到的是全0数组,因此点积结果必然为0。而通过数学转化,我们不需要遍历所有ui-uj组合,既简化了代码又提升了计算效率(尤其当n较大时,这种方法的时间复杂度从O(n²)降到O(n))。
内容的提问来源于stack exchange,提问作者Mahtab
相关产品推荐
相关产品推荐

