Как разделить тип данных HDF5 compund в C ++ - PullRequest
1 голос
/ 14 марта 2011

У меня есть файл HDF5 с составным типом (int, double, double).В настоящее время я читаю его за одну операцию, сохраняя его результат в массиве структур, следуя примеру в документации .

Однако вместо этого я бы предпочел сохранить каждую из трех частейв другом массиве, поэтому я хотел бы предоставить 3 указателя (int *, double *, double *) и читать данные непосредственно в 3 массивах без копирования данных.

Есть ли у кого-нибудь предложения о том, каксделать это?

Ответы [ 2 ]

1 голос
/ 15 марта 2011

Я не думаю, что это возможно напрямую.

Вы можете легко скопировать ваш массив структур в три массива в цикле:

int a[n];
double b[n], c[n];
for (int i = 0; i < n; i++)
{
    a[i] = s[i].a;
    b[i] = s[i].b;
    c[i] = s[i].c;
}

при условии, что s является массивомstruct { int a; double b; double c; } (постоянного) размера n, но у меня есть ощущение, что вы ищете прямой путь HDF5 ...

Ясно, что гиперслаб не будет работать, так как я считаю, что составной типатомное.В любом случае составной тип подразумевает, что данные хранятся в файле состав , поэтому, вероятно, более эффективно читать его таким образом.Единственное ограничение в решении, которое я дал вам, - это память, если ваш массив действительно большой.На современном компьютере все должно быть нормально;)

0 голосов
/ 12 октября 2015

Вы можете определить одно поле в составном типе.Предположим, ваш набор данных открыт как dset с тремя полями "a","b","c", из LENGTH элементов, затем

int a[LENGTH];
double b[LENGTH], c[LENGTH];    

CompType atype(sizeof(int));
atype.insertMember("a", 0, PredType::NATIVE_INT);
dset.read(a, atype);

CompType btype(sizeof(double));
btype.insertMember("b", 0, PredType::NATIVE_DOUBLE);
dset.read(b, btype);

CompType ctype(sizeof(double));
ctype.insertMember("c", 0, PredType::NATIVE_DOUBLE);
dset.read(c, ctype);

Это должно делать то, что вы просили.Может быть, вы уже делаете это, «читая файл три раза»?

...