如何使用协议缓冲区存储双 (1D) 数组?多维(2D 或 3D)密集阵列呢?
原文由 osgx 发布,翻译遵循 CC BY-SA 4.0 许可协议
如何使用协议缓冲区存储双 (1D) 数组?多维(2D 或 3D)密集阵列呢?
原文由 osgx 发布,翻译遵循 CC BY-SA 4.0 许可协议
可以简单地模仿 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 也会知道数据的长度,并且可以导出其他值。
为了便于使用,可能会使用允许通过 double MatrixAdapter::get(int row, int col)
访问的适配器类将矩阵包装在 C++ 中;它还可以验证 data_size()==rows()*cols()
。
原文由 smilingthax 发布,翻译遵循 CC BY-SA 3.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.3k 阅读✓ 已解决
3 回答3.5k 阅读
3 回答527 阅读✓ 已解决
1 回答3.3k 阅读
1 回答3.3k 阅读
一个双精度数组最好通过以下方式存储
repeated
使其充当列表,允许多个项目;packed
避免每个项目的标题。protobuf 中没有对矩形(或更高)数组的直接支持。最接近的是存储类似的东西:
这大致类似于锯齿状数组,但在每一层之间都有一个元素。