Можно сохранить и загрузить части переменных непосредственно в 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 array
{'topo' }
{'topolegend'}
{'topomap1' }
{'topomap2' }
varlist
является массивом ячеек, содержащим имена этих четырех переменных в topography.mat
.
Третьи и четвертые переменные, topomap1
и topomap2
, являются оба массивами, содержащими данные о топографии. Загрузите данные о повышении из третьего столбца каждой переменной в поле массива структур, S
. Для каждого поля задайте имя поля, которое является исходным именем переменной, снабженным префиксом elevationOf_
. Затем получите доступ к данным в каждой переменной как свойства exampleObject
. Поскольку varName
является переменной, заключите его в круглые скобки.
for index = 3:4 varName = varlist{index}; S(1).(['elevationOf_',varName]) = exampleObject.(varName)(:,3); end
Просмотрите содержимое массива структур, S
.
S
S = struct with fields:
elevationOf_topomap1: [64x1 double]
elevationOf_topomap2: [128x1 double]
S
имеет два поля, elevationOf_topomap1
и elevationOf_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);
Различие в синтаксисе является тонким, но значительным.
Любая загрузка или сохраняет операцию, которая использует объект MatFile
, сопоставленный с Версией 7, или более ранний MAT-файл временно загружает целую переменную в память.
Используйте функцию 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> General> MAT-Files. Эта настройка не доступна в MATLAB Online™.