Чтение и запись из/в двоичный файл в Matlab

Мои знания о Matlab - это просто необходимость знать основы, поэтому это, вероятно, элементарный вопрос. Тем не менее здесь он приходит:

У меня есть файл, содержащий данные (16-разрядные целые числа), хранящиеся в двоичном формате. Как я прочитал его в вектор/массив в matlab? Как записать эти данные в файл в Matlab? Есть ли умная настройка для повышения производительности при чтении/записи огромного количества данных (гигабайт)?

Ответы

Ответ 1

Как Bill the Lizard написал, вы можете использовать fread для загрузки данных в вектор. Я просто хочу немного рассказать о его ответе.

Чтение данных

>> fid=fopen('data.bin','rb') % opens the file for reading
>> A = fread(fid, count, 'int16') % reads _count_ elements and stores them in A.

Команды fopen и fread по умолчанию используют кодировку Little-endian [1] для целых чисел. Если ваш файл имеет кодировку Big-endian, вам нужно будет изменить fread на

>> A = fread(fid, count, 'int16', 'ieee-be');

Кроме того, если вы хотите прочитать весь набор файлов

>> count=inf;

и если вы хотите прочитать данные в матрицу с n столбцами, используйте

>> count=[n inf];

Запись данных

Что касается записи данных в файл. Команда, fwrite, в ответе Bill > будет записывать в двоичный файл. Если вы хотите записать данные в текстовый файл, вы можете использовать dlmwrite

>> dlmwrite('data.csv',A,',');

Ссылки

[1] http://en.wikipedia.org/wiki/Endianness

Update

  • Формат машины (IE, ieee-be, ieee-le, vaxd и т.д.) двоичных данных могут быть указаны либо в fopen или fread в Matlab. Подробная информация о поддерживаемых формат машины можно найти в Matlab документация о fopen.

  • комментарий к Bill's ответить предлагает прочитать данные в int16. Для этого используйте

    >> A = int16(fread(fid,count,precision,machineFormat));
    

    где count - размер/форма данные, подлежащие чтению, точность формат данных и машинный формат это кодирование каждого байта.

  • См. команды fseek для перемещения по файлу. Например,

    >> fseek(fid,0,'bof');
    

    перемотает файл в начало, где bof обозначает начало файла.

Ответ 2

Предполагая, что вы знаете, сколько значений вы сохранили в файле, вы можете сделать что-то подобное, чтобы прочитать данные в массиве.

fid = fopen('data.bin','rb')
A = fread(fid, count, 'int16')

Чтобы записать данные в файл, выполните следующие действия:

fid = fopen('data.bin','w')
count = fwrite(fid, A, 'int16')

Функция fwrite возвращает количество элементов (не байтов), записанных в файл.

Что касается настройки производительности, вы можете читать данные в кусках, чтобы использовать столько, сколько нужно для обработки. Это то же самое на любом языке, и нет способа ускорить его, что характерно для Matlab.

Ответ 3

Я обычно ненавижу видеть ссылки в ответе, но это выглядит довольно близко:

http://www.mathworks.com/support/tech-notes/1400/1403.html

Что касается второй части настройки производительности, прошло 6 лет с тех пор, как я использовал Matlab, поэтому не знаю.

НТН