Можно сохранять и загружать части переменных непосредственно в 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);
Различие в синтаксисе тонкая, но значительная.
Любая операция загрузки или сохранения, которая использует 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.