我在功率迭代算法中使用稀疏矩阵的耶鲁表示,一切顺利而快速。
但是,现在我遇到了问题,我的教授会将稀疏矩阵发送到无序的数据文件中,并且由于矩阵是对称的,因此只有一对索引存在。
问题是,在我的实现中,我需要按顺序插入元素。
我尝试了一些东西来读取并插入到我的稀疏矩阵之后:
1)使用密集矩阵。
2)使用另一个稀疏矩阵实现,我尝试使用std :: map。
3)优先级队列,我创建了一个priority_queues数组。我在priority_queue [i]中插入元素i,j,所以当我弹出priority_queue [i]时,我会获取行i的最低j-index。
但我需要一些非常快且内存效率高的东西,因为我将使用的最大矩阵将是100k x 100k,我所做的尝试是如此之慢,几乎比功率迭代本身慢200倍。
有什么建议吗?对不起英语不好:(
答案 0 :(得分:0)
许多稀疏装载机的工作方式是使用中间纯三元组结构。即无论文件是什么样的,您都可以将其加载到vector< tuple< row, column, value> >
。
然后从 构建稀疏结构。原因正是你遇到的。您的稀疏矩阵结构可能存在约束,例如您需要知道每行/每列中的元素数量,或者需要对输入进行排序等。您可以将三元组数组按到您需要的任何内容(即通过排序)。
这也使解决你的对称困境变得微不足道。对于源文件中的每个三元组,您将(row, column, value)
和(column, row, value)
都插入到中间结构中。
另一种选择是简单地编写一个脚本来对教授的文件进行排序。
仅供参考,在稀疏的世界中,元素(非零)的数量是重要的,而不是矩阵的维数。 100k-by-100k
是一条毫无意义的信息。例如,整个矩阵可能完全是空的。