C++ 如何在C++?

C++ 如何在C++?,c++,algorithm,storage,sparse-matrix,C++,Algorithm,Storage,Sparse Matrix,我有一个有6个索引的双精度数组,其中大部分都是零。我还不知道应该用什么类型的内存来存储它 但最重要的是: 我想把它保存到一个文件(二进制文件?)。 保存它最有效的方法是什么? 一个要求是我可以在不经过零的情况下遍历所有非零条目。 如果我为运行6嵌套,我将需要太多的生命 此外,我不知道如何实际保存它:我是否需要两个文件,一个用作索引,另一个包含所有值 谢谢 这可能是一个已解决的问题;可能还有一些稀疏矩阵库也可以为您提供高效的内存表示。(例如,每行是一个代码>索引:值< /代码>,存储在 STD::

我有一个有6个索引的双精度数组,其中大部分都是零。我还不知道应该用什么类型的内存来存储它

但最重要的是: 我想把它保存到一个文件(二进制文件?)。 保存它最有效的方法是什么? 一个要求是我可以在不经过零的情况下遍历所有非零条目。 如果我为运行6嵌套
,我将需要太多的生命

此外,我不知道如何实际保存它:我是否需要两个文件,一个用作索引,另一个包含所有值


谢谢

这可能是一个已解决的问题;可能还有一些稀疏矩阵库也可以为您提供高效的内存表示。(例如,每行是一个代码>索引:值< /代码>,存储在<代码> STD::vector < /代码>,链表,散列,或其他数据结构,取决于插入中间的单个非零值是否有价值或其他操作是否重要)。
二进制格式的存储/加载速度更快,但对于某些表示稀疏数组的方法来说,二进制还是文本并不重要。如果您编写的是二进制格式,这是一种确保其可移植性的好方法,并且不会出现仅在某些体系结构上出现的错误

选项:

  • 简单但有点难看:gzip/lz4/lzma缓冲区保存多维数组,将结果写入磁盘。保存/加载时动态转换为little endian,或将endianness标志存储在格式中

  • 相同的想法,但存储所有6个索引和每个值。如果许多最内部的数组没有非零值,这可能是好的。每个非零值都有一个单独的记录(行,以基于文本的格式)。示例行(为了可读性,三重嵌套示例扩展到6):

表示:
矩阵[3][2][5]=-3.1416

  • 使用嵌套稀疏数组表示法:每行都是index:value的列表。不存在指数为零。文本格式可以使用空格和换行符来分隔内容;二进制格式可以在每行的开头使用一个长度字段,也可以在末尾使用一个哨兵值

    您可以将多维数组展平为一个线性索引,以便使用32位整数索引进行存储,也可以以某种方式表示嵌套。我不打算为它编一个文本格式,因为当我开始思考它时,它变得很难看


    • 这可能是一个已解决的问题;可能还有一些稀疏矩阵库也可以为您提供高效的内存表示。(例如,每行是一个代码>索引:值< /代码>,存储在<代码> STD::vector < /代码>,链表,散列,或其他数据结构,取决于插入中间的单个非零值是否有价值或其他操作是否重要)。
      二进制格式的存储/加载速度更快,但对于某些表示稀疏数组的方法来说,二进制还是文本并不重要。如果您编写的是二进制格式,这是一种确保其可移植性的好方法,并且不会出现仅在某些体系结构上出现的错误

      选项:

      • 简单但有点难看:gzip/lz4/lzma缓冲区保存多维数组,将结果写入磁盘。保存/加载时动态转换为little endian,或将endianness标志存储在格式中

      • 相同的想法,但存储所有6个索引和每个值。如果许多最内部的数组没有非零值,这可能是好的。每个非零值都有一个单独的记录(行,以基于文本的格式)。示例行(为了可读性,三重嵌套示例扩展到6):

      表示:
      矩阵[3][2][5]=-3.1416

      • 使用嵌套稀疏数组表示法:每行都是index:value的列表。不存在指数为零。文本格式可以使用空格和换行符来分隔内容;二进制格式可以在每行的开头使用一个长度字段,也可以在末尾使用一个哨兵值

        您可以将多维数组展平为一个线性索引,以便使用32位整数索引进行存储,也可以以某种方式表示嵌套。我不打算为它编一个文本格式,因为当我开始思考它时,它变得很难看


      6维数组的常规平面表示

      双[10][10][10][10][10]=100万条*8字节~=8MB

      关联数组索引:值表示,假设50%的条目为0.0。。。使用4字节32位索引

      500000*4字节+500000*字节~=6MB

      稀疏数组的位图表示,假设50%的条目为0.0。。。位被设置为每个字节表示数组10000001b中的8个条目,这意味着8个条目,其中仅表示第一个和最后一个条目,6个中间值被忽略,因为它们为零

      ceil(100万/8)字节+500000*8字节~=4.125MB


      6维数组的规则平面表示

      双[10][10][10][10][10]=100万条*8字节~=8MB

      关联数组索引:值表示,假设50%的条目为0.0。。。使用4字节32位索引

      500000*4字节+500000*字节~=6MB

      稀疏数组的位图表示,假设50%的条目为0.0。。。位被设置为每个字节表示数组10000001b中的8个条目,这意味着8个条目,其中仅表示第一个和最后一个条目,6个中间值被忽略,因为它们为零

      ceil(100万/8)字节+500000*8字节~=4.125MB


      我不知道如何提高效率,但一个简单的方法可能是使用
      std::map
      ,如果找不到键,则假定其值为0。您可以使用多种数据压缩算法中的一种
      dimensions on the first line or something
      a b c  val
      ...
      3 2 5   -3.1416