【发布时间】:2011-10-13 02:28:27
【问题描述】:
如何使用协议缓冲区存储双 (1D) 数组? 多维(2D 或 3D)密集数组呢?
【问题讨论】:
-
b1nary.atr0phy,这个问题有一维数组的解决方案;这个问题也是关于 C/C++,而不是关于 .NET。如果我们将我的问题注册为重复问题,是否会合并答案?
标签: c++ multidimensional-array protocol-buffers
如何使用协议缓冲区存储双 (1D) 数组? 多维(2D 或 3D)密集数组呢?
【问题讨论】:
标签: c++ multidimensional-array protocol-buffers
可以简单地模仿 C/C++ 内存布局:
message DoubleMatrix {
required uint32 rows = 1;
required uint32 cols = 2;
repeated double data = 3 [packed=true];
}
要访问数据,请使用data[i*cols+j](行优先)或data[i+rows*j](列优先)。
对于方阵,只需存储rows/cols 之一。技术上即使在矩形情况下protobuf也会知道数据的长度,并且可以推导出其他值。
为了便于使用,可能会在 C++ 中使用允许通过double MatrixAdapter::get(int row, int col) 访问的适配器类来包装矩阵;它还可以验证data_size()==rows()*cols()。
【讨论】:
一个双精度数组最好通过以下方式存储
repeated double foo = 5 [packed=true];
repeated 使其充当列表,允许多个项目; packed 避免每个项目的标题。
protobuf 中没有对矩形(或更高)数组的直接支持。最接近的是存储类似的东西:
repeated innerType foo = 5; // note, can't be "packed"
message innerType {
repeated double foo = 1 [packed=true];
}
这大致类似于锯齿状数组,但在每一层之间都有一个元素。
【讨论】: