协议缓冲区 \- 存储双数组、1D、2D 和 3D

新手上路,请多包涵

如何使用协议缓冲区存储双 (1D) 数组?多维(2D 或 3D)密集阵列呢?

原文由 osgx 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 500
2 个回答

一个双精度数组最好通过以下方式存储

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];
}

这大致类似于锯齿状数组,但在每一层之间都有一个元素。

原文由 Marc Gravell 发布,翻译遵循 CC BY-SA 3.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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题