web-dev-qa-db-ja.com

プロトコルバッファ-二重配列、1D、2D、および3Dを格納します

プロトコルバッファを使用してdouble(1D)の配列を保存するにはどうすればよいですか?多次元(2Dまたは3D)高密度アレイはどうですか?

23
osgx

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

これはおおむねギザギザの配列に似ていますが、各層の間に要素があります。

27
Marc Gravell

単純に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()を検証することもできます。

26
smilingthax