В этом примере показано, как создать три различные карты памяти, а затем записать в каждую из карт с помощью соответствующего синтаксиса. Затем показано, как работать с копиями ваших сопоставленных данных.
Вы можете записать в файл, используя тот же 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
), 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
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