给定一个NxN矩阵W,我想计算一个NxN矩阵C,由这个链接中的方程给出:https://i.stack.imgur.com/dY7rY.png,或者在LaTeX中
$$C_{ij} = \max_k \bigg\{ \sum_l \bigg( W_{ik}W_{kl}W_{lj} - W_{ik}W_{kj} \bigg) \bigg\}.$$
我曾尝试在PyTorch中实现这一点,但我要么通过构建中间NxN 3D矩阵(对于较大的N,这会导致我的GPU内存不足)遇到内存问题,要么使用了速度非常慢的for循环。我想不出怎样才能绕过这些。如果没有这样一个大的中间矩阵,我该如何实现这个计算,或者它的近似值
任何语言的建议、伪代码或Python/Numpy/PyTorch的任何实现都将不胜感激
该公式可简化为:
在哪里
用
N
矩阵的大小W
和W * W
通常的乘积然后,在上面的公式中,对于每一个
i
,j
都有一个独立的最大值需要计算。如果不知道W的进一步性质,通常不可能进一步简化问题。因此,在计算矩阵M
之后,可以在i
和j
上进行循环,并计算最大值使用Numba的第一个解决方案(您可以使用Cython或普通C做同样的事情)是使用简单的循环来描述问题
Francesco提供了一种简化方法,该方法可以更好地扩展较大的阵列大小。这导致了下面的内容,我还优化了一个小的临时数组
这可以通过部分循环展开和优化阵列访问来进一步优化。有些编译器可能会自动执行此操作
计时
相关问题 更多 >
编程相关推荐