Guardar y cargar partes de variables en archivos MAT
Puede guardar y cargar partes de variables directamente en archivos MAT sin cargarlos en la memoria mediante la función matfile
. La principal ventaja de utilizar la función matfile
en lugar de las funciones load
o save
es que puede procesar partes de conjuntos de datos muy grandes que, de otro modo, son demasiado grandes para caber en la memoria. Al trabajar con estas variables grandes, lea y escriba en la memoria tantos datos como sea posible a la vez. De lo contrario, el acceso repetido a los archivos puede afectar negativamente al rendimiento del código.
Guardar y cargar mediante la función matfile
Este ejemplo muestra cómo cargar, modificar y guardar parte de una variable en un archivo MAT existente mediante la función matfile
.
Cree un archivo MAT versión 7.3 con dos variables, A
y B
.
A = rand(5); B = magic(10); save example.mat A B -v7.3; clear A B
Construya un objeto MatFile
a partir del archivo MAT, example.mat
. La función matfile
crea un objeto MatFile
que se corresponde con el archivo MAT y contiene las propiedades del objeto MatFile
. De forma predeterminada, matfile
solo permite cargar desde archivos MAT existentes.
exampleObject = matfile('example.mat');
Para guardarlo, llame a matfile
con el parámetro Writable
.
exampleObject = matfile('example.mat','Writable',true);
De forma alternativa, construya el objeto y configure Properties.Writable
en pasos separados.
exampleObject = matfile('example.mat');
exampleObject.Properties.Writable = true;
Cargue la primera fila de B
desde example.mat
en la variable firstRowB
y modifique los datos. Al indexar en objetos asociados con archivos MAT versión 7.3, MATLAB® solo carga la parte de la variable que especifique.
firstRowB = exampleObject.B(1,:); firstRowB = 2 * firstRowB;
Actualice los valores de la primera fila de la variable B
en example.mat
mediante los valores almacenados en firstRowB
.
exampleObject.B(1,:) = firstRowB;
Con archivos muy grandes, se recomienda leer y escribir en la memoria tantos datos como sea posible a la vez. De lo contrario, el acceso repetido a los archivos afecta negativamente al rendimiento del código. Por ejemplo, suponga que el archivo contiene muchas filas y columnas, y que cargar una sola fila requiere la mayor parte de la memoria disponible. En lugar de actualizar un elemento cada vez, actualice cada fila.
[nrowsB,ncolsB] = size(exampleObject,'B'); for row = 1:nrowsB exampleObject.B(row,:) = row * exampleObject.B(row,:); end
Si la memoria lo permite, puede actualizar todo el contenido de una variable a la vez.
exampleObject.B = 10 * exampleObject.B;
De forma alternativa, actualice una variable llamando a la función save
con la opción -append
. La opción -append
solicita que la función save
reemplace únicamente la variable especificada, B
, y deje intactas otras variables del archivo. Este método siempre requiere que cargue y guarde toda la variable.
load('example.mat','B'); B(1,:) = 2 * B(1,:); save('example.mat','-append','B');
Añada una variable al archivo mediante el objeto matlab.io.MatFile
.
exampleObject.C = magic(8);
También puede añadir la variable llamando a la función save
con la opción -append
.
C = magic(8); save('example.mat','-append','C'); clear C
Cargar partes de variables dinámicamente
Este ejemplo muestra cómo acceder a partes de variables de un archivo MAT dinámicamente. Esto es útil cuando se trabaja con archivos MAT cuyos nombres de variables no siempre se conocen.
Considere el archivo MAT de ejemplo, topography.mat
, que contiene uno o más arreglos con nombres desconocidos. Construya un objeto MatFile
que se corresponda con el archivo, topography.mat
. Llame a who
para obtener los nombres de variables del archivo.
exampleObject = matfile('topography.mat');
varlist = who(exampleObject)
varlist = 4x1 cell
{'topo' }
{'topolegend'}
{'topomap1' }
{'topomap2' }
varlist
es un arreglo de celdas que contiene los nombres de las cuatro variables de topography.mat
.
Las variables tercera y cuarta, topomap1
y topomap2
, son ambas arreglos que contienen datos del mapa de colores. Cargue los datos del mapa de colores de la tercera columna de cada variable en un campo del arreglo de estructura, S
. Para cada campo, especifique un nombre de campo que sea el nombre de variable original prefijado por colormap_
. Después, acceda a los datos de cada variable como propiedades de exampleObject
. Dado que varName
es una variable, introdúzcala entre paréntesis.
for index = 3:4 varName = varlist{index}; S(1).(['colormap_',varName]) = exampleObject.(varName)(:,3); end
Consulte el contenido del arreglo de estructura, S
.
S
S = struct with fields:
colormap_topomap1: [64x1 double]
colormap_topomap2: [128x1 double]
S
tiene dos campos, colormap_topomap1
y colormap_topomap2
, cada uno de los cuales contiene un vector columna.
Evitar la carga accidental de variables completas
Cuando se desconozca el tamaño de una variable grande de un archivo MAT y se desee cargar solo partes de dicha variable de una vez, evite usar la palabra clave end
. Mediante la palabra clave end
, se carga temporalmente todo el contenido de la variable en cuestión en la memoria. Con variables muy grandes, la carga lleva mucho tiempo o genera errores Out
of
Memory
. En su lugar, llame al método size
para objetos MatFile
.
Por ejemplo, este código carga temporalmente todo el contenido de B
en la memoria:
lastColB = exampleObject.B(:,end);
Utilice este código en su lugar para mejorar el rendimiento:
[nrows,ncols] = size(exampleObject,'B');
lastColB = exampleObject.B(:,ncols);
De forma similar, cada vez que hace referencia a una variable con sintaxis con el formato matObj.varName
, como exampleObject.B
, MATLAB® carga temporalmente toda la variable en la memoria. Por lo tanto, asegúrese de llamar al método size
para objetos MatFile
con la siguiente sintaxis:
[nrows,ncols] = size(exampleObject,'B');
en lugar de pasar todo el contenido de exampleObject.B
a la función size
:
[nrows,ncols] = size(exampleObject.B);
La diferencia en la sintaxis es sutil, pero significativa.
Cargar y guardar de manera parcial requiere archivos MAT de la versión 7.3
Cualquier operación para cargar o guardar que utilice un objeto MatFile
asociado a un archivo MAT de la versión 7 o anterior carga temporalmente toda la variable en la memoria.
Utilice la función matfile
para crear archivos con el formato de la versión 7.3. Por ejemplo, este código
newfile = matfile('newfile.mat');
crea un archivo MAT que admite cargar y guardar de manera parcial.
Sin embargo, de forma predeterminada, la función save
crea archivos MAT de la versión 7. Convierta archivos MAT existentes a la versión 7.3 llamando a la función save
con la opción -v7.3
, de la siguiente manera:
load('durer.mat'); save('mycopy_durer.mat','-v7.3');
Para cambiar sus preferencias para guardar nuevos archivos con el formato de la versión 7.3, acceda a la sección Environment de la pestaña Home y haga clic en Preferences. Seleccione MATLAB > General > MAT-Files. Esta preferencia no está disponible en MATLAB Online™.