Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

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

>> count=inf;

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

>> count=[n inf];

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

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

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

Рекомендации

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

Обновлять

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

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

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

ХТХ

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top