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

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

Можно записать в файл с помощью тех же команд 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Синтаксис для записи в отображаемый файл

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

Пример: 15x1 uint16 массив

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 = 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

Смотрите также

Похожие темы

Была ли эта тема полезной?