在我当前的项目中,我必须对一些事情使用稀疏向量。但是,由于我不负责这个项目,所以我不能使用我想要的任何外部库。我只有 STL 和 OpenCV 可用。
我已经查看了几个 stackoverflow 回答的问题,但它们要么专注于特定方法,而是在专门处理稀疏向量时比较有限数量的方法 (2) 和外部库。实现稀疏矩阵也有一些很好的想法。
我想要的是一个稀疏向量(索引总是一维的,数据与这个问题无关)。我想要的东西不会是一个单独的项目来实现,但可以用于不仅仅是演示目的(例如,我想达到一个不错的速度而不是太多的内存开销),并希望重新 -以后用。我考虑过的选项包括:
- 根据我的需要调整SparseMat的OpenCV实现
- 使用 a
std::map
来存储值(或者可能制作一个非常简单的包装器,在索引零元素的情况下将返回默认值) - 使用我可以在元素
std::vector< std::pair < int , data_type > >
中存储索引和数据的地方std::pair
对于作为稀疏向量的通用用途,这些解决方案中的任何一个是否更好/更差?我知道每件事的每一种方法都有其起伏,但非常感谢关于选择哪种方法的有争议的建议。此外,如果有人认为他有更好的建议,推荐一种我没有考虑过的方法将非常受欢迎。
在我的具体情况下的用法如下:
- 向量在创建后很可能不会被修改(现在我认为没有任何必要,但我不能保证 100% 它不会出现)
- 预计最常见的操作是两个这样的向量的点积(因此,或多或少地以线性顺序方式访问元素)
- 我现在可以预见的唯一查找是(也许)检查天气某个元素是否为零元素
- 预计会有大约 500 个非零元素
- 简而言之,大多数时候稀疏向量将用作向量(多维点)的数学概念,而无需单独检查每个坐标
尽管如此,正如我在最初的问题中所写的那样,我想要关于通用稀疏向量实现的建议。