【问题标题】:protocol buffers - store an double array, 1D, 2D and 3D协议缓冲区 - 存储双数组、1D、2D 和 3D
【发布时间】:2011-10-13 02:28:27
【问题描述】:

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

【问题讨论】:

标签: c++ multidimensional-array protocol-buffers


【解决方案1】:

可以简单地模仿 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()

【讨论】:

    【解决方案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];
    }
    

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

    【讨论】:

    • 请把“大致类似于锯齿状数组”翻译成更多的编程英语?
    • @osgx 而不是“数组数组”,它更像是一个“对象数组,每个对象一个数组” - 更好?
    • @osgx 不,那将是重复; protobuf 将负责长度
    • 虽然这是一个正确的解决方案,但它使用的存储空间比@smilingthax 在替代答案中建议的将矩阵存储为一维数组要多。
    猜你喜欢
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2010-11-28
    相关资源
    最近更新 更多