Запись двумерного массива int [n] [m] в файл HDF5 с использованием переполнения стека Visual

Я только начинаю с HDF5 и буду признателен за советы по следующим вопросам.

У меня есть 2-й массив: data[][] перешел в метод. Метод выглядит так:

void WriteData( int data[48][100], int sizes[48])

Размер данных на самом деле не 48 х 100, а 48 х размеров [i]. То есть каждый ряд может быть разной длины! В одном простом случае, с которым я имею дело, все строки имеют одинаковый размер (но не 100), поэтому вы можете сказать, что размер массива равен 48 X [0].

Как лучше написать это в HDF5?

У меня есть некоторый рабочий код, где я перебираю от 0 до 48 и создаю новый набор данных для каждой строки.

Что-то вроде:

for (int i = 0; i < 48; i++)
{
hsize_t      dsSize[2];
dsSize[0] = 48;
dsSize[1] = sizes[0];  // use sizes[i] in most general case
// Create the Data Space
DataSpace dataSpace = DataSpace(2, dsSize);
DataSet dataSet = group.createDataSet(dataSetName, intDataType, dataSpace);
dataSet.write(data[i], intDataType);
}

Есть ли способ записать данные все сразу в один DataSet? Возможно, одно решение для более простого случая всех рядов одинаковой длины, а другое для рваных рядов?

Я попробовал несколько вещей безрезультатно. Я вызвал dataSet.write (data, intDataType), то есть бросил в него весь массив. Кажется, я получил мусор в файле, подозреваю, потому что массив, в котором хранятся данные, на самом деле имеет размер 48×100, и мне нужна только небольшая часть этого.

Мне пришло в голову, что я мог бы использовать double ptrs int ** или vector>, но я застрял на этом. Насколько я могу сказать, «написать» нужна пустота * ptr. Кроме того, я хотел бы, чтобы файл «выглядел правильно». То есть Одна гигантская строка со всеми строками данных нежелательна. Если я должен идти по этому пути, кому-то понадобится хитрый способ хранения информации, который позволил бы мне считывать данные обратно из файла (возможно, хранить длины строк как атрибуты). ?).

Возможно, моя настоящая проблема — найти примеры C ++ нетривиальных вариантов использования.

Буду признателен за любую оказанную помощь.

Дейв

2

Решение

Вот как вы можете сделать это, используя массивы переменной длины если ваши данные представляют собой вектор векторов (что, по-видимому, имеет смысл для вашего варианта использования):

void WriteData(const std::vector< std::vector<int> >& data)
{
hsize_t dim(data.size());
H5::DataSpace dspace(1, &dim);
H5::VarLenType dtype(H5::PredType::NATIVE_INT);
H5::DataSet dset(group.createDataSet(dataSetName, dtype, dspace));
hvl_t vl[dim];
for (hsize_t i = 0; i < dim; ++i)
{
vl[i].len = data[i].size();
vl[i].p = &data[i][0];
}
dset.write(vl, dtype);
}
2

Другие решения


По вопросам рекламы [email protected]