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

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

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

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

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

Похожие темы

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