2011-07-26 10 views
14

プロトコルバッファを使用して格納されたdouble(1D)の配列はどのようになりますか? 多次元(2Dまたは3D)密集配列はどうですか?プロトコルバッファ - 1D、2D、3Dのダブル配列を格納

+0

[ProtoBuf-Netを使用すると、多次元配列をどのように直列化するのですか?](http://stackoverflow.com/questions/4090173/using-protobuf-net-how-to-deserialize- a-multi-dimensional-array) –

+0

b1nary.atr0phy、この質問には1D配列の解決策があります。 C/C++についてのこの質問は、.NETに関するものではありません。質問を重複して登録すると、回答がマージされますか? – osgx

答えて

20

doubleの配列が最高

repeated double foo = 5 [packed=true]; 

repeatedを経由して格納されますが、それは複数の項目を許可、リストとして機能します。 packedは、アイテムごとのヘッダーを回避します。

protobufの長方形(またはそれ以上)の配列は直接サポートされていません。最も近いのは次のようなものを格納することです:

これは概してギザギザの配列に似ていますが、各ティアの間に要素があります。

+3

「大まかにギザギザのアレイに似ています」をより多くのプログラミング英語に翻訳してください。 – osgx

+3

@osgxではなく、 "配列の配列"よりも "配列のあるオブジェクトの配列"によく似ています。 –

+0

はい。追加のフィールドに配列サイズを保存する必要がありますか? – osgx

20

一つは、単に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つのみを格納する必要があります。技術的には、長方形の場合でも、プロトタイプはデータの長さを知り、他の値を導き出すことができます。

使いやすさのために、おそらく、double MatrixAdapter::get(int row, int col)経由でアクセスを許可するアダプタクラスを使ってC++でMatrixをラップします。 data_size()==rows()*cols()を確認することもできます。

関連する問題