2015-10-13 42 views
3

我正在将数据收集到一个4D数组中(这是大部分代码已经实现了),并且我正在记录数据(即将有多个4D数组)。在矢量中存储4D数组?

四维阵列的总大小是浮筒的8x2x8x150即float data[8][2][8][150]

欲能够每个后续传入四维阵列存储到用于存储/处理的载体后。

我明白,虽然C++中的数组不能按原样存储在向量中。我怎样才能轻松地将这些数据存储一段时间(即不是一个固定的向量大小)?请记住,这是一个相当大的数据集(〜每四维阵列38KB)

+3

要么你正确的元素手动存储所有信息的载体和索引,或者你使用'boost :: multi_array'这样的东西' – sbabbi

回答

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; 

}; 
+0

虽然我们没有理由需要创建一个新的类, – VermillionAzure

+0

@VermillionAzure,这比处理一个一维向量索引的细节要好得多。 –

+0

@Sipty,我想我是对的。看看这个:http://ideone.com/ATyAyp。 –

-2

你可以存储它19200元的一维数组,

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

你可以定义一个别名来定义的一段时间内具有多层面几乎与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可存储,只使用所得到的数组:

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

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;