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

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

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

Убедитесь, что у вас есть разрешение записи к отображаемому файлу. Установите 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=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- 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

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

Похожие темы

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