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