How can be an array of double (1D) stored using protocol buffer? What about multi-dimensional (2D or 3D) dense arrays?
One could simply mimic the C/C++ memory layout:
message DoubleMatrix {
required uint32 rows = 1;
required uint32 cols = 2;
repeated double data = 3 [packed=true];
}
To access the data, use data[i*cols+j]
(row-major), or data[i+rows*j]
(column-major).
For square matrices only one of rows
/cols
has to be stored. Technically even in the rectangular case protobuf will know the length of the data, and the other value can be derived.
For ease of use one would probably wrap the Matrix in C++ with an Adapter class that allows access via double MatrixAdapter::get(int row, int col)
; it could also verify data_size()==rows()*cols()
.
An array of double would be best stored via
repeated double foo = 5 [packed=true];
repeated
makes it act as a list, allowing multiple items; packed
avoids a header per item.
There is no direct support for rectangular (or higher) arrays in protobuf. The closest is to store something like:
repeated innerType foo = 5; // note, can't be "packed"
message innerType {
repeated double foo = 1 [packed=true];
}
this is broadly akin to a jagged array, but with an element between each tier.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With