Main Content

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. Esta técnica es útil cuando se trabaja con archivos MAT cuyos nombres de variables no se conocen.

Construya un objeto MatFile que se corresponda con el archivo de muestra topography.mat. Utilice la función who para guardar los nombres de las variables del archivo en el arreglo de celdas varlist.

exampleObject = matfile("topography.mat");
varlist = who(exampleObject)
varlist = 3x1 cell
    {'topo'    }
    {'topomap1'}
    {'topomap2'}

Las variables segunda y tercera, topomap1 y topomap2, son ambas matrices de tres columnas que contienen datos del mapa de colores. Cargue los datos del mapa de colores de la tercera columna de cada una de estas dos variables en un campo de una estructura S. Para cada campo, especifique un nombre de campo que sea el nombre de variable original precedido 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 = 2:3
    varName = varlist{index};
    S.("colormap_"+varName) = exampleObject.(varName)(:,3);
end

Vea el contenido de la estructura. La estructura tiene dos campos, colormap_topomap1 y colormap_topomap2, y cada uno de ellos contiene un vector columna.

S
S = struct with fields:
    colormap_topomap1: [64x1 double]
    colormap_topomap2: [128x1 double]

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™.

Consulte también

| |

Temas relacionados