Сохраните и загрузите части переменных в 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. The 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 опция. The -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 > General > MAT-Files. Этот выбор недоступен в Online™ MATLAB.

См. также

| |

Похожие темы

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