我在一些三元组中保留稀疏矩阵表示的非零值,在数字社区中称为压缩稀疏行存储,条目按行存储,例如4x4矩阵表示为
r:0 0 1 1 2 2 3 3 3
c:0 3 2 3 2 3 1 2 3
v:1 5 2 2 4 1 5 4 5
所以'r'给出行索引,'c'给出列索引,'v'是与该值之上的2个索引关联的值。
我想从矩阵表示中删除一些行和列,比如行和列:1和3.所以我应该从'r'和'c'数组中删除1和3。我也试图了解更多关于stl容器的性能并阅读更多内容。首次尝试时,创建一个multimap并通过使用multimap的find方法循环遍历它们来删除它们。这将删除找到的键但是可能会在“c”数组中保留一些搜索值,然后我交换键,值对并对第二个映射执行相同的操作,但这对我来说似乎不是一个很好的解决方案,它似乎相当快(在50000条目的问题上),但。那么问题是使用标准容器执行此操作的最有效方法是什么?
答案 0 :(得分:0)
您可以使用地图(在一对行和列之间)和值,例如map<pair<int,int>, int>
如果您想删除一行,则迭代元素并删除那些带有待删除行的元素。对于列也可以这样做。
答案 1 :(得分:0)
您是如何访问矩阵的?您是否查找特定的行/列并以这种方式使用它们,或者您是否一次使用整个矩阵进行矩阵向量乘法或分解例程等操作?如果您通常不按行/列进行索引,那么将数据存储在std::vector
容器中可能会更有效。
然后,您的删除操作是直接遍历容器,向下滑动后续元素以代替您要删除的条目。显然,这里涉及到权衡。您的地图/多地图方法将花费O(k log n)
时间来删除k
条目,但该表示中的全矩阵运算效率非常低(尽管仍然希望O(n)
而不是{{1} }})。
使用数组表示,删除单个行或列将花费O(n log n)
时间,但您可以通过将其索引保存在一对哈希表中来删除同一行中的任意数量的行或列或者展开树并对每个条目进行查找。在删除扫描之后,您可以将向量调整到您剩余的元素数量,这样可以节省内存但可能需要复制,或者只是保留有效条目的明确计数,交换死存储器以节省时间。