У меня есть очень большое количество файлов, которые были сохранены в двоичном виде в Labview, где каждый столбец является кластером временной метки, за которым следует вектор синглов.Как LabView сохраняет данные кластера в двоичном файле и как его читать в MATLAB?
Я прочитал каждый файл данных в Matlab с использованием r2013a
fid = fopen(filename);
data = fread(fid,[N M],'*single',0,'b');
fclose(fid);
где я предварительно рассчитать размер входного массива N, M. Так как я знаю, что эти данные должны выглядеть, я понял, что data(1:5,:)
где спрятана данные метки времени, но, похоже, что-то подобное для M = 1
:
[0 -842938.0625 -1.19209289550781e-07 0 4.48415508583941e-42]
Первый элемент всегда 0, второй элемент монотонно уменьшается с постоянным размером шага, третий, по-видимому, является бистабильным, переворачивается назад и вперед между двумя очень маленькими значениями, четвертый всегда равен 0, а пятый также постоянный.
Я предполагаю, что это связано с тем, как Labview кодирует даты, но мой google-fu не помог мне понять это.
Чтобы сделать это более общий вопрос, то:
Как Labview кодирует временную метку кластера, когда он сохраняет в двоичный файл, и как я могу прочитать его и перевести его в соответствующее число в другом программировании язык, такой как Matlab?
EDIT: Для потомков, вот мой окончательный код (прилагается к коду выше):
datedata = data(5:-1:1,:);
data(1:5,:) = [];
dms = typecast(reshape(datedata(2:3,:),[],1),'uint64');
dsecs = typecast(reshape(datedata(4:5,:),[],1), 'int64');
timestamp = datenum(1904,1,1) + (double(dsecs) + double(dms)*2^-64)/(3600*24);
В коде @Floris размещены от Mathworks, они типаж прямо в два раза, но когда я Пробовал, я получил мусор. Чтобы получить правильную дату, мне пришлось сначала преобразовать в целое число, а затем удвоить. Так как мое узкое место находится в линии fread
(0,3 секунды для считывания с внешнего диска), дополнительный шаг по типу незначителен в великой схеме вещей.
Дополнительный столбец 4.5e-42 преобразует в целочисленное значение 3200, количество значений в последующем векторе синглов.
Если у вас есть доступ к коду LabVIEW, вы можете попытаться сохранить эти кластеры в файл как строку или как XML. Я не знаю, насколько велики файлы, но эти форматы будут намного проще читать MATLAB. –
Индивидуальные файлы не такие большие (~ 14 Мб каждый), но их очень много. У меня есть один полностью полный привод 1 ТБ, и я работаю над вторым. Даже если я решил изменить код, эта кошка хорошо вышла из сумки. – craigim
Справа. Похоже, вы застряли с тем, что у вас есть. Для справок в будущем: полезно как можно больше репетировать миграцию данных, когда это возможно, поскольку это такая склонная к ошибкам и трудная операция. –