【问题标题】:Store a 4D array in a Vector?将 4D 数组存储在 Vector 中?
【发布时间】:2015-10-13 22:02:15
【问题描述】:

我正在将数据收集到一个 4D 数组中(大部分代码已经实现),并且我正在随着时间的推移记录数据(即会有多个 4D 数组)。

4D 数组的总大小为 8x2x8x150 个浮点数,即float data[8][2][8][150]

我希望能够将每个后续传入的 4D 数组存储到一个向量中,以便以后保存/操作。

不过,我理解 C++ 中的数组不能按原样存储在向量中。如何轻松地将这些数据存储不确定的时间(即不是固定的向量大小)?请记住,这是一个相当大的数据集(每个 4D 数组约 38Kb)

【问题讨论】:

  • 要么将所有内容存储在向量中并手动索引正确的元素,要么使用类似boost::multi_array

标签: c++ arrays vector


【解决方案1】:

您可以创建一个帮助类,将数据存储在 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;

};

【讨论】:

  • 不过,我们没有理由需要创建一个新课程吗?
  • @VermillionAzure,这比到处处理索引到一维向量的细节要好。
  • @Sipty,我想我是对的。看看这个:ideone.com/ATyAyp.
【解决方案2】:

您可以定义一个别名来定义 std::array 的某个时间,它具有多个维度,几乎与使用 C 样式数组一样简单:

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 中,因此只需使用生成的数组即可:

using my_array = multi_array_t<int, 2, 3>;
my_array arr1 {{ 
    {{1, 2, 3}}, 
    {{4, 5, 6}} 
}};
my_array arr2 {{ 
    {{7, 8, 9}}, 
    {{10, 11, 12}} 
}};

std::vector<my_array> vector {arr1, arr2};
assert(vector[0][0][1] == 2);
assert(vector[1][1][2] == 12);

Live demo

【讨论】:

    【解决方案3】:

    有趣的问题。我想你可能会对今年 cppcon 上 Pramod Gupta 的 C++ Multi-dimensional Arrays 演讲感兴趣。

    基本上,使用他的orca_array 库(仅标头,MIT 许可证),您应该能够执行以下操作:

    #inclue <vector>
    #include "orca_array.hpp"
    
    std::vector<orca_array::array4d<double>> my_vector_of_4d_arrays;
    

    【讨论】:

      【解决方案4】:

      您可以将其存储为 19200 个元素的一维数组,访问方式为

      array[i*2400 + j*1200 + k*150 + l] // array[i,j,k,l]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多