2014-01-29 3 views
1

Я хотел бы прочитать гетерогенные двоичные данные в matlab. Я знаю с самого начала, сколько это и в каком типе данных каждый сегмент. Например:Matlab читает гетерогенные двоичные данные

%double %double %int32 ... 

, а затем это повторяется примерно в миллион раз. Легкий enoug для обработки с fread, поскольку известно количество укусов для каждого сегмента и поэтому может рассчитать значение пропуска для каждой строки.

Но теперь сегмент данных выглядит следующим образом:

%double %int32%*char %double %double ... 

Посредством чего int до *char является длина указанной строки. Это приводит к тому, что я больше не могу рассчитать пропуск, и я застрял в чтении всего файла за строкой, поэтому мне нужно сделать намного больше доступа к файлам и замедлить все.

Чтобы получить хотя бы некоторую скорость, я не буду читать всего %double %double ... (около 30 элементов) за один раз, а затем использовать их из буфера, чтобы заполнить массив. В C это было бы довольно простой задачей здесь, без memcpy и не так прямого доступа к указателям ...

Вы знаете какой-либо способ достичь этого, не используя файлы mex?

+1

Я не думаю, что есть встроенная функция, которая бы поняла, «прочитайте столько символов, что этот int говорит вам». Учитывая этот «динамический характер» формата, я думаю, что повторный выбор является единственным выбором. – sebastian

+0

Другая мысль: если вы влияете на формат, вы можете подумать о сохранении символов с фиксированной длиной, заполняя более короткий массив символов нулями при необходимости. Это применимо только в том случае, если char-массивы находятся в пределах определенной длины ... – sebastian

+0

@sebastian. К несчастью, у меня нет никакого контроля на этой стороне. Он в значительной степени исправлен, как есть. В противном случае я бы выбрал что-то вроде HDF5, и мне не пришлось бы разбираться со всеми этими ... –

ответ

1

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

readlen = 1024; 
buf = fread(fid, readlen, '*uint8'); % the asterisk keeps the returned array as uint8 
rec.val1 = typecast(buf(1:8), 'double'); 
string_len = typecast(buf(9:12), 'int32'); 
rec.str1 = typecast(buf(13:13+string_len-1), 'uint8'); 

pos = 13+string_len; 
rec.val2 = typecast(buf(pos:pos+8-1), 'double'); 

Вы можете обернуть простую функцию вокруг этой техники, чтобы отслеживать текущее смещение автоматически.

+0

Очень приятно. Я не знал, что в Matlab существует модель. спасибо –

Смежные вопросы