В этом примере показано, как создать две различных карты распределения памяти, и затем читать из каждой из карт с помощью соответствующего синтаксиса. Затем это показывает, как изменить свойства карты и анализировать ваши данные.
Можно считать содержимое файла, который вы сопоставили с памятью с помощью тех же команд 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
значение 1 024, чтобы начать карту 1 024 байта с запуска файла. Задайте 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
из 1 000 элементов типа double
, запуск на уровне 1025-го байта.
m = memmapfile('double.dat','Offset',1024, ... 'Format','double','Repeat',1000);
Скопируйте Data
свойство к переменной, k
. Затем сопоставьте данные с картой и постройте БПФ первых 100 значений карты.
k = m.Data; plot(abs(fft(k(1:100))))
Это - первый раз, когда на данные ссылаются и - когда фактическое отображение файла к адресному пространству 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