Запись в отображаемый файл

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

Вы можете записать в файл, используя тот же 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 СвойствоСинтаксис записи в отображаемый файл

Числовой массив

Пример: 15x1 uint16 array

m.Data = X;

Скалярный (1 на 1) массив структур

Пример:

1x1 struct array with fields:
                x
                y

m.Data.fieldname = X;

fieldname - имя поля.

Нескаляр (n-by-1) массив структур

Пример:

20x1 struct array with fields:
                x
                y

m.Data(k).fieldname = X;

k является скалярным индексом и fieldname - имя поля.

Класс 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

См. также

Похожие темы