我想从磁盘(HDF5)加载N维矩阵到std::vector
对象.
我事先知道他们的等级,而不是形状.例如,其中一个矩阵是4级std::vector<std::vector<std::vector<std::vector<float>>>> data;
我想使用向量来存储值,因为它们是标准的而不像c-arrays那样难看(主要是因为它们知道它们的长度).
但是,加载它们的方法是使用一个加载函数void *
,该函数采用a ,这对于1级向量可以正常工作,我可以调整它们然后访问它的数据指针(vector.data()
).对于更高级别,vector.data()
只会指向vector
s,而不是实际数据.
最糟糕的情况我只是将所有数据加载到辅助c数组然后手动复制,但这可能会使大矩阵的速度降低很多.
有没有办法在向量中包含连续的多维数据,然后获得单个地址?
如果你担心性能请不要使用矢量向量的向量....
这就是原因.我认为@OldPeculier的答案值得一读.
它既胖又慢的原因实际上是一样的.矩阵中的每个"行"是单独分配的动态数组.在时间和空间上进行堆分配都很昂贵.分配器花费时间进行分配,有时运行O(n)算法来完成分配.并且分配器为每个行数组"填充"额外的字节用于簿记和对齐.额外的空间成本......嗯...额外的空间.当你去释放矩阵时,解除分配器也会花费额外的时间,辛苦地释放每个单独的行分配.想到这一点,让我流连忘返.
这是另一个原因,它很慢.这些单独的分配往往存在于不连续的内存部分.一行可能在地址1,000,另一行在地址100,000 - 您可以得到这个想法.这意味着当你遍历矩阵时,你就像一个狂野的人一样跳过记忆.这往往会导致缓存未命中,从而大大减慢处理时间.
因此,如果您绝对必须拥有可爱的[x] [y]索引语法,请使用该解决方案.如果你想要快速和小巧(如果你不关心那些,为什么你在使用C++?),你需要一个不同的解决方案.