Этот пример показывает, как создать три различных карты распределения памяти, и затем записать в каждую из карт с помощью соответствующего синтаксиса. Затем это показывает, как работать с копиями ваших сопоставленных данных.
Можно записать в файл с помощью тех же команд MATLAB®, которые вы используете для переменных доступа в MATLAB workspace. Путем доступа к свойству Data
карты распределения памяти содержимое отображаемого файла появляется как массив в в настоящее время активной рабочей области. Просто индексируйте в этот массив, чтобы записать данные к файлу. Синтаксис, чтобы использовать, когда запись в расширенную память зависит от формата свойства Data
карты распределения памяти.
Во-первых, создайте файл примера под названием records.dat
в вашей текущей папке.
myData = gallery('uniformdata', [5000,1], 0); fileID = fopen('records.dat','w'); fwrite(fileID, myData,'double'); fclose(fileID);
Сопоставьте файл как последовательность целых чисел 16-битных без знака. Используйте аргумент в виде пар "имя-значение" Format
, чтобы указать, что значения имеют тип uint16
.
m = memmapfile('records.dat', ... 'Offset',20, ... 'Format','uint16', ... 'Repeat',15);
Поскольку файл сопоставлен как последовательность единого класса (uint16
), Data
является числовым массивом.
Гарантируйте, чтобы у вас было разрешение записи к отображаемому файлу. Установите свойство Writable
карты распределения памяти, m
, к true
.
m.Writable = true;
Создайте матричный X
, который одного размера как свойство Data
, и запишите его в сопоставленную часть файла. Вся обычная индексация MATLAB и правила класса применяется при присвоении значений данным с помощью карты распределения памяти. Класс, которому вы присваиваете, должен быть достаточно большим, чтобы содержать присваиваемое значение.
X = uint16(1:1:15); m.Data = X;
X
1 15 вектор целочисленных значений в пределах от 1 - 15.
Проверьте, что новые значения были записаны в файл. Задайте значение Offset
0, чтобы начать читать с начала файла. Задайте значение Repeat
35, чтобы просмотреть в общей сложности 35 значений. Используйте функцию reshape
, чтобы отобразить значения как 7 5 матрица.
m.Offset = 0; m.Repeat = 35; reshape(m.Data,5,7)'
ans = 7x5 uint16 matrix
47662 34773 26485 16366 58664
25170 38386 16333 14934 9028
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
10085 14020 16349 37120 31342
62110 16274 9357 44395 18679
Значения в X
были записаны в файл, records.dat
.
Сопоставьте область файла, records.dat
, как 300 8 матрица типа uint16
, на который могут сослаться имя поля, x
, сопровождаемый 200 5 матрица типа double
, который может быть ссылкой именем поля, y
. Задайте разрешение записи к отображаемому файлу с помощью аргумента в виде пар "имя-значение" Writable
.
m = memmapfile('records.dat', ... 'Format', { ... 'uint16' [300 8] 'x'; ... 'double' [200 5] 'y' }, ... 'Repeat', 1, 'Writable', true);
Просмотрите свойство Data
m.Data
ans = struct with fields:
x: [300x8 uint16]
y: [200x5 double]
Data
является скалярным массивом структур. Это вызвано тем, что файл, records.dat
, сопоставлен как содержащий несколько типов данных, которые не повторяются.
Замените матрицу в поле, x
, с матрицей из всех единиц.
m.Data.x = ones(300,8,'uint16');
Сопоставьте файл, records.dat
, как 25 8 матрица типа uint16
, сопровождаемый 15 5 матрица типа double
. Повторите шаблон 20 раз.
m = memmapfile('records.dat', ... 'Format', { ... 'uint16' [5 4] 'x'; ... 'double' [15 5] 'y' }, ... 'Repeat', 20, 'Writable', true);
Просмотрите свойство Data
m.Data
ans = 20x1 struct array with fields:
x
y
Data
является нескалярным массивом структур, потому что файл сопоставлен как повторяющаяся последовательность нескольких типов данных.
Запишите массив из всех единиц к полю под названием x
в 12-м элементе Data
.
m.Data(12).x = ones(5,4,'uint16');
Для 12-го элемента Data
запишите значение, 50, ко всем элементам в строках 3 - 5 поля, x
.
m.Data(12).x(3:5,1:end) = 50;
Просмотрите поле, x
, 12-го элемента Data
.
m.Data(12).x
ans = 5x4 uint16 matrix
1 1 1 1
1 1 1 1
50 50 50 50
50 50 50 50
50 50 50 50
Синтаксис, чтобы использовать, когда запись в расширенную память зависит от формата свойства Data
карты распределения памяти. Просмотрите свойства карты распределения памяти путем введения имени объекта memmapfile
.
Эта таблица показывает синтаксисы для записи матрицы, X
, к карте распределения памяти, m
.
Формат свойства Data | Синтаксис для записи в отображаемый файл |
---|---|
Числовой массив Пример: | m.Data = X; |
Скалярный массив структур (1 на 1) Пример: 1x1 struct array with fields: x y | m.Data.fieldname = X;
|
Нескалярный ( Пример: 20x1 struct array with fields: x y | m.Data(k).fieldname = X;
|
Класс X
и числа элементов в X
должен совпадать с теми из свойства Data
или поля получаемого доступ свойства Data
. Вы не можете изменить размерности свойства Data
после того, как вы создали карту распределения памяти с помощью функции memmapfile
. Например, вы не можете уменьшить или расширить размер массива путем удаления или добавления строки от сопоставленного массива, m.Data
Данные.
Если вы сопоставляете целый файл и затем добавляете к тому файлу после построения карты, добавленные данные не включен в сопоставленную область. Если необходимо изменить размерности данных, которые вы сопоставили с картой распределения памяти, m
, необходимо или изменить свойства Format
или Repeat
для m
или воссоздать m
с помощью функции memmapfile
.
Чтобы успешно изменить отображаемый файл, у вас должно быть разрешение записи для того файла. Если у вас нет разрешения записи, пытание записать в файл генерирует ошибку, даже если свойством Writable
является true
.
Эта часть примера показывает, как работать с копиями ваших сопоставленных данных. Данные в переменном d
являются копией данных файла, сопоставленных m.Data(2)
. Поскольку это - копия, изменение данных массива в d
не изменяет данные, содержавшиеся в файле.
Создайте файл примера под названием double.dat
.
myData = gallery('uniformdata',[5000,1],0) * 100; fileID = fopen('double.dat','w'); fwrite(fileID,myData,'double'); fclose(fileID);
Сопоставьте файл как ряд матриц double
.
m = memmapfile('double.dat', ... 'Format', { ... 'double' [5 5] 'x'; ... 'double' [4 5] 'y' });
Просмотрите значения в m.Data(2).x
x.
m.Data(2).x
ans = 5×5
50.2813 19.3431 69.7898 49.6552 66.0228
70.9471 68.2223 37.8373 89.9769 34.1971
42.8892 30.2764 86.0012 82.1629 28.9726
30.4617 54.1674 85.3655 64.4910 34.1194
18.9654 15.0873 59.3563 81.7974 53.4079
Скопируйте содержимое m.Data
к переменной, d
.
d = m.Data;
Запишите все нули в поле под названием x
в копии.
d(2).x(1:5,1:5) = 0;
Проверьте, что нули записаны в d(2).x
d(2).x
ans = 5×5
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
Проверьте, что данные в отображаемом файле не изменяются.
m.Data(2).x
ans = 5×5
50.2813 19.3431 69.7898 49.6552 66.0228
70.9471 68.2223 37.8373 89.9769 34.1971
42.8892 30.2764 86.0012 82.1629 28.9726
30.4617 54.1674 85.3655 64.4910 34.1194
18.9654 15.0873 59.3563 81.7974 53.4079