Как я могу сохранить вектор строки в HDF в MATLAB? - PullRequest
2 голосов
/ 28 января 2011

По какой-то причине метод hdf5write в MATLAB автоматически преобразует мои векторы строк в векторы столбцов, когда я перечитываю их:

>> hdf5write('/tmp/data.h5','/data',rand(1,10));
>> size(hdf5read('/tmp/data.h5','/data'))

ans =

    10     1

Однако для вектора строк в третьем измерении,все возвращается просто отлично:

>> hdf5write('/tmp/data.h5','/data',rand(1,1,10));
>> size(hdf5read('/tmp/data.h5','/data'))

ans =

     1     1    10

Как мне заставить hdf5write сделать правильные вещи для векторов строк?Они должны возвращаться как 1 x 10, а не 10 x 1.

edit проблема немного сложнее, потому что я использую mex на основе c для фактического чтения данных позже, вместо этогоhdf5read.Более того, проблема на самом деле заключается в hdf5write, и это видно в самих файлах hdf5:

>> hdf5write('/tmp/data.h5','/data',randn(1,10));
>> ! h5ls /tmp/data.h5

data                     Dataset {10}

, то есть данные сохраняются как одномерный массив вфайл hdf5.Для сравнения я попробую то же самое с реальной 2-мерной матрицей (чтобы показать, как она выглядит), 1-мерным вектором столбца, 1-мерным вектором по третьему измерению и, для ударов, попробую V71Dimensions трюк, который есть в справке для hdf5read и hdf5write:

>> hdf5write('/tmp/data.h5','/data',randn(10,1)); %1-d col vector
>> ! h5ls /tmp/data.h5

data                     Dataset {10}
>> hdf5write('/tmp/data.h5','/data',randn(1,1,10)); %1-d vector along 3rd dim; annoying
>> ! h5ls /tmp/data.h5

data                     Dataset {10, 1, 1}
>> hdf5write('/tmp/data.h5','/data',randn(2,5)); %2-d matrix. notice the reversal in dim order
>> ! h5ls /tmp/data.h5

data                     Dataset {5, 2}
>> hdf5write('/tmp/data.h5','/data',randn(1,10),'V71Dimensions',true); %1-d row; option does not help
>> ! h5ls /tmp/data.h5

data                     Dataset {10}

Итак, проблема, похоже, в hdf5write.Флаг 'V71Dimensions' не помогает: результирующий файл hdf5 по-прежнему является набором данных {10} вместо набора данных {10,1}.

Ответы [ 2 ]

4 голосов
/ 28 января 2011

Проблема в чтении.В справке

[...] = hdf5read (..., 'V71Dimensions', BOOL) указывается, следует ли изменять большинство наборов данных, считанных из файла.Если BOOL имеет значение true, hdf5read переставляет первые два измерения набора данных, как это было в предыдущих выпусках (MATLAB 7.1 [R14SP3] и ранее).Такое поведение предназначалось для учета разницы в том, как HDF5 и MATLAB выражают размеры массива.HDF5 описывает размеры набора данных в основном порядке строк;MATLAB хранит данные в главном порядке столбцов.Однако изменение этих измерений может некорректно отражать назначение данных и может сделать недействительными метаданные.Когда BOOL имеет значение false (по умолчанию), измерения данных правильно отражают порядок данных в том виде, в каком они записаны в файле - каждое измерение в выходной переменной соответствует одному и тому же измерению в файле.

Таким образом:

hdf5write('/tmp/data.h5','/data',rand(1,10));
size(hdf5read('/tmp/data.h5','/data','V71Dimensions',true))
ans =
     1    10
1 голос
/ 18 февраля 2011

Боюсь за это, вам придется использовать низкоуровневый HDF5 API от Matlab.

В Matlab низкоуровневый API доступен с использованием, например, H5.open(...), H5D.write(...) искоро.Имена точно соответствуют названиям библиотеки C (см. Документ HDF5 ).Однако есть небольшая разница в аргументах, которые они принимают, но функция matlab help расскажет вам все, что вам нужно знать ...

Хорошая новость заключается в том, что версия API Matlab еще меньшемногословнее, чем версия C.Например, вам не нужно закрывать вручную типы данных, пространства данных и т. Д., Поскольку Matlab закрывает их для вас, когда переменные выходят из области видимости.

...