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

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

Можно записать в файл с помощью тех же команд MATLAB®, которые вы используете для переменных доступа в рабочем пространстве MATLAB. Путем доступа к свойству 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 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 = 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.

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

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

Похожие темы