如何在C ++中存储一个大矩阵

时间:2012-06-14 07:00:21

标签: c++ image-processing

我正在编写一个关于图像处理的程序。我需要存储一个大小为480 000列和480 000行的int方阵。任何想法我该怎么做?

5 个答案:

答案 0 :(得分:4)

不要使用480,000 x 480,000矩阵。

拥有这个完整矩阵(假设它不稀疏)的唯一原因是具有随机访问(即能够随时访问任何元素)。即使您可以以某种方式实现此目的(存储0.9Tb),数据访问将极其慢(特别是在将其映射到文件时),从而使您的算法效率低下。

相反,想一想重新编写算法的方法,这样就不需要随时随机访问整个矩阵,但可能只需要创建(然后删除)的一小部分。在需要时,或任何其他方式减少存储这么多数据的需要。

高性能不仅仅是减少计算量,更重要的是减少随机数据访问。

答案 1 :(得分:3)

您可以将其存储在文件中,并将您需要的矩阵部分映射到内存中。参见例如http://en.wikipedia.org/wiki/Memory-mapped_file

答案 2 :(得分:3)

如果你需要同时处理整个矩阵,并且大多数矩阵元素都是空白的,那么你应该考虑使用某种sparse matrix数据结构。许多线性代数库支持稀疏矩阵(Boost.uBlasEigen等),以及一些图像处理库(OpenCV等)。

答案 3 :(得分:1)

这取决于矩阵的特征。

它会有很多0吗?如果是这样,您可以使用稀疏矩阵实现,它不存储0。

如果是带状矩阵,则只能存储对角线带。

您必须查看矩阵属性并查看可以节省内存的位置。如果找不到允许此类优化的任何属性,则必须将其存储在文件中。

答案 4 :(得分:0)

如果它是一个稀疏矩阵并且您需要对其进行线性代数,我会使用一些科学的线性代数库,如Trilinos(使用Epetra或Tpetra包)或Hypre。这些是高度并行的库(如果您可以并行运行代码,这很好)。我从来没有使用过Hypre(虽然我听说有点比Trilinos更好的表现),所以我不能告诉你任何事情。 Trilinos是一个巨大的(我会说太大了)库,有大约50-60个包,它不是很容易学习;但如果你必须处理巨大的矩阵,那么依赖一些经过充分测试和开发的TPL是有道理的。 对于矩阵存储,Epetra / Tpetra是Trilinos中要考虑的软件包。