Сохранение и загрузка частей переменных в 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 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);

Различие в синтаксисе является тонким, но значительным.

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

Любая загрузка или сохраняет операцию, которая использует объект 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™.

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

| |

Похожие темы

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