exponenta event banner

Чтение из сопоставленного файла

В этом примере показано, как создать две различные карты памяти, а затем считывать из каждой карты с использованием соответствующего синтаксиса. Затем показано, как изменить свойства карты и проанализировать данные.

Содержимое файла, сопоставленного с памятью, можно прочитать с помощью тех же команд MATLAB ®, которые используются для чтения переменных из рабочей области MATLAB. Путем доступа кData свойства карты памяти, содержимое сопоставленного файла отображается как массив в текущей активной рабочей области. Чтобы прочитать нужные данные из файла, просто выполните индексирование в массив. Для повышения производительности скопируйте Data поле переменной, а затем считывание сопоставленного файла с помощью этой переменной:

dataRef = m.Data;

for k = 1 : N

y(k) = dataRef(k);

end

Напротив, чтение непосредственно из memmapfile объект медленнее:

for k = 1 : N

y(k) = m.Data(k);

end

Считывание из карты памяти как числового массива

Сначала создайте образец файла данных с именем records.dat содержит матрицу из чисел с плавающей запятой с двойной точностью 5000 на 1.

rng('default')
randData = rand([5000,1]);

fileID = fopen('records.dat','w');
fwrite(fileID,randData,'double'); 
fclose(fileID);

Отображение 100 чисел с двойной точностью с плавающей запятой из файла в память, а затем считывание части отображенных данных. Создайте карту памяти, m. Укажите Offset значение 1024 для начала отображения 1024 байт с начала файла. Укажите Repeat значение 100 для отображения значений 100.

m = memmapfile('records.dat','Format','double', ...
      'Offset',1024,'Repeat',100);

Копировать Data свойство переменной, d. Затем отобразите формат d.

d = m.Data;

whos d
  Name        Size            Bytes  Class     Attributes

  d         100x1               800  double              

Отображенные данные являются 800-байтовым массивом, так как их 100 double значения, для каждого из которых требуется 8 байт.

Считывание выбранного набора чисел из файла путем индексирования в вектор, d.

d(15:20)
ans = 6×1

    0.3510
    0.5132
    0.4018
    0.0760
    0.2399
    0.1233

Считывание из карты памяти как нескалярной структуры

Отображение частей данных в файле, records.dat, как последовательность из нескольких типов данных.

Позвоните в memmapfile для создания карты памяти, m.

  m = memmapfile('records.dat',  ...
      'Format', {              ...
         'uint16' [5 8] 'x';   ...
         'double' [4 5] 'y' });

Format параметр сообщает memmapfile для обработки первых 80 байт файла как матрицы 5 на 8 uint16 значения и 160 байт после этого в виде матрицы 4 на 5 double значения. Этот шаблон повторяется до тех пор, пока не будет достигнут конец файла.

Копировать Data свойство переменной, d.

d = m.Data
d=166×1 struct array with fields:
    x
    y

d представляет собой массив структуры из 166 элементов с двумя полями. d является массивом нескалярной структуры, поскольку файл сопоставлен как повторяющаяся последовательность нескольких типов данных.

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

d(3)
ans = struct with fields:
    x: [5x8 uint16]
    y: [4x5 double]

Прочитайте x поле этой структуры из файла.

d(3).x
ans = 5x8 uint16 matrix

   62645   30353   12492   16358   58958    9377   48754   16323
   14152   21370   16352   21042   61010   33482   16321   22042
    2657   16336   37389   35249   45699   16353   47136   59002
   16360   41668    9638   33351   16366    3344   58286   31491
    5368   55234   24278   16364   55768    7216    7184   16336

MATLAB форматирует блок данных как матрицу 5 на 8 из uint16 значения, указанные в Format собственность.

Прочитайте y поле этой структуры из файла.

d(3).y
ans = 4×5

    0.8407    0.9293    0.6160    0.5853    0.7572
    0.2543    0.3500    0.4733    0.5497    0.7537
    0.8143    0.1966    0.3517    0.9172    0.3804
    0.2435    0.2511    0.8308    0.2858    0.5678

MATLAB форматирует блок данных как матрицу 4 на 5 из double значения.

Изменение свойств карты и анализ данных

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

Создать образец файла с именем double.dat.

randData = rand([5000,1]);
fileID = fopen('double.dat','w');
fwrite(fileID,randData,'double'); 
fclose(fileID);

Создать memmapfile object 1000 элементов типа double, начиная со 1025-го байта.

m = memmapfile('double.dat','Offset',1024,  ...
      'Format','double','Repeat',1000);

Копировать Data свойство переменной, k. Затем получают данные, связанные с картой, и строят график БПФ первых 100 значений карты.

k = m.Data;
plot(abs(fft(k(1:100))))

Figure contains an axes. The axes contains an object of type line.

Это первый случай обращения к данным, когда происходит фактическое сопоставление файла с адресным пространством MATLAB.

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

m.Offset = 4096;
m.Format = 'single';
m.Repeat = 800;

m теперь является memmapfile объект 800 элементов типа single. Карта теперь начинается с 4096-го байта в файле, records.dat.

Считывайте из части файла, начинающейся с 4096-го байта, и вычисляйте максимальное значение данных. Эта команда сопоставляет новую область с предыдущей.

X = max(m.Data)
X = single
    3.2278e+38

См. также

Связанные темы