我正在将数据收集到一个4D数组中(这是大多数代码已经实现的方式)并且我随时间记录数据(即将有多个4D数组)。
4D阵列的总大小为8x2x8x150个浮点数,即float data[8][2][8][150]
我希望能够将每个后续传入的4D数组存储到一个向量中,以便以后保存/操作。
我理解,C ++中的数组不能按原样存储在向量中。如何在不确定的时间内(即不是固定的矢量大小)轻松存储此数据?请记住,这是一个相当大的数据集(每个4D阵列约38Kb)
答案 0 :(得分:2)
您可以创建一个辅助类,将数据存储在std::vector
中,但提供4D数组的接口。
struct My4DArray
{
My4DArray(int d1, int d2, int d3, int d4) :
d1(d1), d2(d2), d3(d3), d4(d4), data(d1*d2*d3*d4) {}
float& at(int i1, int i2, int i3, int i4)
{
return data[getIndex(i1, i2, i3, i4)];
}
int getIndex(int i1, int i2, int i3, int i4)
{
assert(i1 >= 0 && i1 < d1);
assert(i2 >= 0 && i2 < d2);
assert(i3 >= 0 && i3 < d3);
assert(i4 >= 0 && i4 < d4);
// ??? Need to verify the formula.
return (((i1*d2 + i2)*d3 + i3)*d4 + i4);
}
int d1;
int d2;
int d3;
int d4;
std::vector<float> data;
};
答案 1 :(得分:1)
您可以定义一个别名,用于定义一段时间的ax[i]
,其中多个维度几乎与C样式数组一样简单:
std::array
然后,由于template<typename Type, std::size_t N, std::size_t... Sizes>
struct multi_array {
using type = std::array<typename multi_array<Type, Sizes...>::type, N>;
};
template<typename Type, std::size_t N>
struct multi_array<Type, N> {
using type = std::array<Type, N>;
};
template<typename Type, std::size_t... Sizes>
using multi_array_t = typename multi_array<Type, Sizes...>::type;
可以存储在std::array
中,只需使用生成的数组:
std::vector
答案 2 :(得分:0)
有趣的问题。我想你可能会对Pramod Gupta今年的cppcon C++ Multi-dimensional Arrays谈话感兴趣。
基本上,使用他的orca_array库(仅限标题,MIT许可证),您应该可以执行以下操作:
#inclue <vector>
#include "orca_array.hpp"
std::vector<orca_array::array4d<double>> my_vector_of_4d_arrays;
答案 3 :(得分:-2)
您可以将其存储为19200个元素的一维数组,以
形式访问array[i*2400 + j*1200 + k*150 + l] // array[i,j,k,l]