所以,我使用的布尔矩阵的维度通常是几十到几百,它们通常非常稀疏(在大多数行和列中只有2-4个非零)并且我的运行时间主要由他们的乘法。
在这些情况下,哪种数据结构最适合加速乘法?
目前我将每个矩阵存储在一个连续的bitset(64位长的数组)中,并且基本上将它们与标准算法相乘,只需通过定位下一个设置位的快速操作来加速稀疏性总而言之,通过位掩码操作进行矢量化。
我是否应该使用一些稀疏表示呢?
答案 0 :(得分:4)
您可能需要考虑使用四叉树表示法。四叉树可以很好地编码稀疏矩阵,并且适用于非常简单(和缓存有效)的递归乘法实现。使基本情况为8x8矩阵,以便您可以将乘法实现为(程序集优化的?)64位乘64位运算。
答案 1 :(得分:0)
我认为使用稀疏表示是有意义的。即使有一些非零指数这样简单的东西,我认为你会获得更好的表现。
例如,对于具有300个非零元素的100×100矩阵,使用2D阵列表示,乘法需要100×100×100 = 1,000,000“操作”。使用索引集只需要300×300 = 90,000次操作。 (当然,这些操作无法直接比较。)
答案 2 :(得分:0)
1的x和y的列表。例如:
[0,2,0,12,0,60,1,2,1,39 ......等]
这意味着在0,12等处有0,2 a 1,等等。
很好的部分是你并不真的需要一种新的数据类型,而且它只是简单地解析。
要相乘,您需要查找所有匹配/部分匹配的索引。