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

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

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

См. также

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте