буферы протокола - храните двойной массив, 1D, 2D и 3D - PullRequest
21 голосов
/ 26 июля 2011

Как может храниться массив double (1D) с использованием буфера протокола?А как насчет многомерных (2D или 3D) плотных массивов?

Ответы [ 2 ]

26 голосов
/ 03 марта 2013

Можно просто имитировать структуру памяти 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.Технически даже в прямоугольном случае protobuf будет знать длину данных, и можно получить другое значение.

Для простоты использования можно было бы обернуть Matrix в C ++ классом Adapter, который обеспечивает доступ через double MatrixAdapter::get(int row, int col);это также может проверить data_size()==rows()*cols().

25 голосов
/ 26 июля 2011

Массив 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];
}

, это в целом похоже на зубчатый массив, но с элементом между каждым уровнем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...