Чтение и запись из / в двоичный файл в Matlab - PullRequest
14 голосов
/ 15 октября 2008

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

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

Ответы [ 3 ]

16 голосов
/ 16 октября 2008

Как писал 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

Обновление

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

  2. Скотт Френчс комментарий к Биллу ответить предлагает прочитать данные в переменная int16. Для этого используйте

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

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

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

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

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

10 голосов
/ 15 октября 2008

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

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

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

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

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

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

0 голосов
/ 15 октября 2008

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

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

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

НТН

...