【发布时间】:2016-06-21 11:40:30
【问题描述】:
我正在使用一个需要在稀疏矩阵中访问和存储数据的程序。大约 40-60% 的矩阵将是非零的,维度是从 14K 到 22K 元素的正方形。
这是我的问题 - 我将执行 很多 行和列操作。主要是添加、删除和交换。我查看了大多数现有的众所周知的稀疏矩阵格式(CRS、CCS、COO、块格式等),其中大多数似乎不太接受这些类型的操作。在您开始添加和删除整行或整列的那一刻,您不得不将所有元素更新到被操纵的行/列的任一侧,这是我想尽可能避免的事情(这发生在我身上您可能会以这样一种方式管理元素,即它们在矩阵中的坐标实际上存储为一对指向公共行或列索引的指针,并且通过简单地增加或减少该值来避免手动更新数千个元素)。
那里有类似的东西吗?
【问题讨论】:
-
既然你有这么多的操作,而且你使用的是稀疏矩阵,你不应该考虑使用链表数组来代替吗?您将节省浪费的空间,并且您的操作应该更容易(特别是交换)
-
你考虑过
std::unordered_map<std::tuple<int, int>, double, tuplehasher>吗? -
一个典型的矩阵有多少行,多少列? “尺寸从 14K 到 22K 元素正方形” - 这是否意味着总共有 14K 到 22K 元素?或者一个矩阵是14000*14000到22000*22000?
-
另外,你想要什么?你想节省时间吗?或者您想节省内存,并准备牺牲一些时间?或者是其他东西?同时,您提供的信息太少,无法给出有意义的答案。
-
如果你有不频繁的读取和频繁的写入,你可以存储一个更改列表,并按需合成修改后的矩阵。