exponenta event banner

Сохранение и загрузка частей переменных в MAT-файлы

Можно сохранять и загружать части переменных непосредственно в MAT-файлы, не загружая их в память с помощью matfile функция. Основное преимущество использования matfile над функцией load или save функции позволяют обрабатывать части очень больших наборов данных, которые в противном случае были бы слишком большими для размещения в памяти. При работе с этими большими переменными одновременно считывайте и записывайте в память как можно больше данных. В противном случае повторный доступ к файлам может негативно повлиять на производительность кода.

Сохранить и загрузить с помощью matfile Функция

В этом примере показано, как загрузить, изменить и сохранить часть переменной в существующем MAT-файле с помощью matfile функция.

Создайте MAT-файл версии 7.3 с двумя переменными, A и B.

A = rand(5);
B = magic(10);
save example.mat A B -v7.3;
clear A B

Построить MatFile объект из MAT-файла, example.mat. matfile функция создает MatFile объект, который соответствует MAT-файлу и содержит свойства MatFile объект. По умолчанию matfile позволяет загружать только из существующих MAT-файлов.

exampleObject = matfile('example.mat');

Чтобы включить сохранение, позвоните matfile с Writable параметр.

exampleObject = matfile('example.mat','Writable',true);

Можно также построить объект и задать Properties.Writable отдельными шагами.

exampleObject = matfile('example.mat');
exampleObject.Properties.Writable = true;

Загрузить первую строку B от example.mat в переменную firstRowB и измените данные. При индексировании по объектам, связанным с MAT-файлами версии 7.3, MATLAB ® загружает только указанную часть переменной .

firstRowB = exampleObject.B(1,:); 
firstRowB = 2 * firstRowB;

Обновить значения в первой строке переменной B в example.mat используя значения, сохраненные в firstRowB.

exampleObject.B(1,:) = firstRowB;

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

[nrowsB,ncolsB] = size(exampleObject,'B');
for row = 1:nrowsB
  exampleObject.B(row,:) = row * exampleObject.B(row,:);
end

Если память не является проблемой, можно одновременно обновить все содержимое переменной.

exampleObject.B = 10 * exampleObject.B;

Либо обновите переменную, вызвав save функции с помощью -append вариант. -append опция запрашивает, чтобы save функция заменяет только указанную переменную, Bи оставьте другие переменные в файле нетронутыми. Этот метод всегда требует загрузки и сохранения всей переменной.

load('example.mat','B');
B(1,:) = 2 * B(1,:);
save('example.mat','-append','B');

Добавление переменной в файл с помощью matlab.io.MatFile объект.

exampleObject.C = magic(8);

Можно также добавить переменную, вызвав save функции с помощью -append вариант.

C = magic(8);
save('example.mat','-append','C');
clear C

Динамическая загрузка частей переменных

В этом примере показан динамический доступ к частям переменных из MAT-файла. Это полезно при работе с MAT-файлами, имена переменных которых не всегда известны.

Рассмотрим пример MAT-файла, topography.mat, который содержит один или несколько массивов с неизвестными именами. Построить MatFile объект, соответствующий файлу, topography.mat. Звонить who для получения имен переменных в файле.

exampleObject = matfile('topography.mat');
varlist = who(exampleObject)
varlist = 4x1 cell
    {'topo'      }
    {'topolegend'}
    {'topomap1'  }
    {'topomap2'  }

varlist - массив ячеек, содержащий имена четырех переменных в topography.mat.

Третья и четвертая переменные, topomap1 и topomap2оба массива содержат данные карты цветов. Загрузите данные карты цветов из третьего столбца каждой переменной в поле массива структуры, S. Для каждого поля укажите имя поля, которое является именем исходной переменной, префиксом которого является colormap_. Затем доступ к данным в каждой переменной в качестве свойств exampleObject. Поскольку varName является переменной, заключите ее в скобки.

for index = 3:4
    varName = varlist{index};
    S(1).(['colormap_',varName]) = exampleObject.(varName)(:,3);
end

Просмотр содержимого массива структуры, S.

S
S = struct with fields:
    colormap_topomap1: [64x1 double]
    colormap_topomap2: [128x1 double]

S имеет два поля, colormap_topomap1 и colormap_topomap2, каждый из которых содержит вектор-столбец.

Избежать непреднамеренной загрузки всех переменных

Если размер большой переменной в MAT-файле неизвестен и требуется загрузить одновременно только части этой переменной, избегайте использования end ключевое слово. Использование end ключевое слово временно загружает в память все содержимое рассматриваемой переменной. Для очень больших переменных загрузка занимает много времени или генерирует Out of Memory ошибки. Вместо этого вызовите size способ для MatFile объекты.

Например, этот код временно загружает все содержимое B в памяти:

lastColB = exampleObject.B(:,end);

Используйте этот код для повышения производительности:

[nrows,ncols] = size(exampleObject,'B');
lastColB = exampleObject.B(:,ncols);

Аналогично, при любой ссылке на переменную с синтаксисом формы matObj.varName, такие как exampleObject.B, MATLAB ® временно загружает всю переменную в память. Поэтому обязательно вызовите size способ для MatFile объекты с синтаксисом, например:

[nrows,ncols] = size(exampleObject,'B');

вместо передачи всего содержимого exampleObject.B в size функция,

[nrows,ncols] = size(exampleObject.B);

Разница в синтаксисе тонкая, но существенная.

Частичная загрузка и сохранение требует файлов MAT версии 7.3

Любая операция загрузки или сохранения, использующая MatFile объект, связанный с MAT-файлом версии 7 или более ранней, временно загружает всю переменную в память.

Используйте matfile для создания файлов в формате версии 7.3. Например, этот код

newfile = matfile('newfile.mat');

создает MAT-файл, поддерживающий частичную загрузку и сохранение.

Однако по умолчанию save создает MAT-файлы версии 7. Преобразование существующих MAT-файлов в версию 7.3 путем вызова save функции с помощью -v7.3 вариант, например:

load('durer.mat');
save('mycopy_durer.mat','-v7.3');

Чтобы изменить настройки для сохранения новых файлов в формате версии 7.3, откройте раздел Среда (Environment) на вкладке Главная страница (Home) и щелкните Настройки (Preferences). Выберите MATLAB > Общие > MAT-файлы. Эта настройка недоступна в MATLAB Online™.

См. также

| |

Связанные темы