如何在boost::multi_array容器中存储和访问元素?
问题解答
报错原因
你遇到的error: no matching function for call to 'boost::multi_array<float, 2>::data(int)'报错,是因为boost::multi_array的data()成员是无参方法,作用是返回指向容器首元素的裸指针,你调用时传入了int参数才会触发匹配失败。另外要注意:boost::multi_array没有内置类似std::vector的at()边界检查方法,不要尝试调用.at()访问元素。
元素的正确访问与存储
二维multi_array默认是C风格行优先存储,直接用[][]运算符即可访问对应位置的元素,赋值也可以直接操作对应位置:
array_2d_t arr = read_frame(argv[1], 0); // 读取第0帧数据 // 访问第i行第j列的元素,i取值范围0~11213,j取值范围0~2 float val = arr[2][1]; // 取第3行第2列的元素 arr[5][0] = 3.14f; // 给第6行第1列的元素赋值
展平为一维序列
因为普通multi_array的所有元素在内存中是连续存储的,可以直接通过首指针和元素总个数快速转成一维容器,不需要逐个拷贝:
// 方法1:转成std::vector<float>持有数据 std::vector<float> flat_arr(arr.data(), arr.data() + arr.num_elements()); // 方法2:如果不需要持有内存,直接用裸指针操作一维连续内存 float* flat_ptr = arr.data(); size_t total_size = arr.num_elements(); // 总大小为11214*3=33642 // 访问第k个元素直接用flat_ptr[k]即可,对应原二维的行号为k/3,列号为k%3
main函数读取数据到采样序列的实现
你注释中要求的取10个采样值的需求,可以参考下面的代码修改main函数:
int main(int argc, char const* argv[]) { if (argc < 2) { std::cout << "Usage: " << argv[0] << " input.h5" << std::endl; return -1; } auto ds = open_dataset(argv[1]); std::vector<float> first_cells = cell_from_all_frames(ds, 0, 0); // 读取第0帧的二维数据 array_2d_t frame_data = read_frame(argv[1], 0); size_t nsamples = 10; size_t row_step = frame_data.shape()[0]; // 行步长为11214 std::vector<float> nsamples_values; nsamples_values.reserve(nsamples); for (size_t i = 0; i < nsamples; ++i) { // 边界检查避免越界 if (i * row_step >= frame_data.shape()[0]) break; // 取对应行第0列的元素存入采样序列 nsamples_values.push_back(frame_data[i * row_step][0]); } // 后续可以直接使用nsamples_values做计算 return 0; }
内容的提问来源于stack exchange,提问作者Mahesh
相关产品推荐
相关产品推荐

