プロトコルバッファを使用してdouble(1D)の配列を保存するにはどうすればよいですか?多次元(2Dまたは3D)高密度アレイはどうですか?
Doubleの配列は、
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];
}
これはおおむねギザギザの配列に似ていますが、各層の間に要素があります。
単純に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
の1つだけを保存する必要があります。技術的には、長方形の場合でも、protobufはデータの長さを認識し、他の値を導出できます。
使いやすさのために、おそらくdouble MatrixAdapter::get(int row, int col)
を介したアクセスを許可するAdapterクラスでMatrixをC++でラップします。 data_size()==rows()*cols()
を検証することもできます。