В этом примере показано, как создать три различных карты распределения памяти, и затем записать в каждую из карт с помощью соответствующего синтаксиса. Затем это показывает, как работать с копиями ваших сопоставленных данных.
Можно записать в файл с помощью тех же команд MATLAB®, которые вы используете для переменных доступа в рабочем пространстве MATLAB. Путем доступа к Data
свойство карты распределения памяти, содержимое отображаемого файла появляется как массив в в настоящее время активной рабочей области. Просто индексируйте в этот массив, чтобы записать данные к файлу. Синтаксис, чтобы использовать, когда запись в расширенную память зависит от формата Data
свойство карты распределения памяти.
Во-первых, создайте файл примера под названием records.dat
, в вашей текущей папке.
rng('default') myData = rand([5000,1]); 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
данные
числовой массив.
Убедитесь, что у вас есть разрешение записи к отображаемому файлу. Установите 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
47739 26762 4663 16362 3197
24407 64575 16364 31612 40832
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
12673 53994 16337 46560 44024
32781 16353 24667 24572 41957
Значения в 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=20×1 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 = rand([5000,1])*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
.
m.Data(2).x
ans = 5×5
95.0545 54.7696 15.6697 97.2605 85.0706
53.2131 60.9054 5.8124 60.5319 25.6792
24.7686 86.3135 33.9707 33.8236 28.5496
43.7276 38.0696 81.7176 92.7984 77.9947
66.9088 74.8956 37.7548 89.8425 70.1395
Скопируйте содержимое 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
95.0545 54.7696 15.6697 97.2605 85.0706
53.2131 60.9054 5.8124 60.5319 25.6792
24.7686 86.3135 33.9707 33.8236 28.5496
43.7276 38.0696 81.7176 92.7984 77.9947
66.9088 74.8956 37.7548 89.8425 70.1395