2011-07-26 20 views
14

¿Cómo puede ser una matriz de doble (1D) almacenados usando tampón de protocolo? ¿Qué hay de las matrices densas multidimensionales (2D o 3D)?de protocolo - almacenar una doble matriz, 1D, 2D y 3D

+0

posible duplicado de [Usando ProtoBuf-Net, cómo (de) serializar una matriz multidimensional?] (Http://stackoverflow.com/questions/4090173/using-protobuf-net-how-to-deserialize- una matriz multidimensional) –

+0

b1nary.atr0phy, esta pregunta tiene solución para matrices 1D; esta pregunta también sobre C/C++, no sobre .NET. Si registramos mi pregunta como duplicada, ¿se fusionarán las respuestas? – osgx

Respuesta

20

Una matriz de doble sería mejor almacenado a través de

repeated double foo = 5 [packed=true]; 

repeated hace actuar como una lista, que permite que varios artículos; packed evita un encabezado por artículo.

No hay soporte directo para las matrices rectangulares (o superior) en protobuf. El más cercano es almacenar algo como:

esto es ampliamente similar a una matriz escalonada, pero con un elemento entre cada nivel.

+3

Por favor, traduce "ampliamente similar a una matriz dentada" a más programación en inglés? – osgx

+3

@osgx en lugar de una "matriz de matrices", sería más como una "matriz de objetos, cada uno de los cuales * tiene * una matriz", ¿es mejor? –

+0

sí. ¿Debo guardar tamaños de arreglo en un campo adicional? – osgx

20

Uno podría simplemente imitar el diseño de memoria C/C++:

message DoubleMatrix { 
    required uint32 rows = 1; 
    required uint32 cols = 2; 
    repeated double data = 3 [packed=true]; 
} 

Para acceder a los datos, utilice data[i*cols+j] (fila-mayor), o data[i+rows*j] (columna-major). Para matrices cuadradas sólo una de rows/cols tiene que ser almacenado. Técnicamente, incluso en el caso rectangular protobuf sabrá la longitud de los datos, y el otro valor se puede derivar.

Para facilitar su uso uno probablemente envolver la matriz en C++ con una clase de adaptador que permite el acceso a través de double MatrixAdapter::get(int row, int col); también podría verificar data_size()==rows()*cols().

Cuestiones relacionadas