如何使用协议缓冲区存储双精度数组(1D)?多维稠密数组(2D或3D)呢?
可以简单地模仿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)
进行访问;它还可以验证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];
}
这与嵌套数组类似,但每层之间都有一个元素。
import "google/protobuf/struct.proto";
message DoubleMatrix {
uint32 cols = 1;
uint32 rows = 2;
repeated google.protobuf.ListValue values = 3;
}
{
"cols": 2,
"rows": 2,
"values": [[1, 2], [3, 4]]
}