问题:在 numpy 中,我有一个M1
要与另一个矩阵相乘的矩阵M2
。
我知道我可以保留一半的值,M1
因为生成的矩阵是对称的,我只需要最高k
值。
因此,我正在考虑将numpy.tril
一半的值归零,希望底层的 C 函数对于乘法运算会更快a*b
,a==0
因为它们可以在看到a==0
而不是执行整个浮点运算时停下来。
我知道我可以计时,但我认为这是一个普遍感兴趣的问题。
请注意,这M1
不是稀疏的,只是不需要考虑其中的一半。
也许还有更好的方法来节省 50% 的计算?
背景:这与
p(A|B)*p(B) == p(B|A)*p(A)
...如果你明白我的意思。
示例:这只是发生的一点,但最后,我们有
- 一个|一个| x |A| 矩阵
p(A|B)
(A和B是相同的变量) - 1 x |A| 矩阵
p(B)
- 结果是 |A| x |A|
p(A,B) = p(A|B)*p(B)
我们不关心对角线的矩阵,因为它是给定值本身和对角线上方或下方部分的概率,因为它是另一半的重复。很适合进行健全性检查,但毕竟没有必要。
请注意,这里它实际上不是点积。但我想导致 p(A|B) 的一半计算也是不必要的。
更新: 我将为此应用程序采取更合理的方法,即限制 A 和 B 不相交。然后所有矩阵的大小都会减小。它可以在 numpy 中优雅地完成,但会增加阅读代码的复杂性。
毕竟这没有任何意义。唯一的选择是创建M1.shape[0]-1
重新创建三角形的子矩阵,但这肯定会产生太多开销。