Contenido principal

Guardar y cargar partes de variables en archivos MAT

Puede usar la función matfile para guardar y cargar partes de variables directamente en MATLAB® sin cargarlas en la memoria. 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 usando la función matfile.

Cree un archivo MAT de la 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. De forma predeterminada, la función matfile solo permite cargar desde archivos MAT existentes.

exampleObject = matfile("example.mat");

Para permitir guardar, llame a matfile con el argumento nombre-valor 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. Cuando se indexa en objetos asociados con archivos MAT de la 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 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 = 3×1 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: [64×1 double]
    colormap_topomap2: [128×1 double]

Evitar la carga accidental de variables completas

Cuando se desconozca el tamaño de una variable grande de un archivo MAT y desee cargar solo partes de esa variable de una vez, evite usar la palabra clave end y evite hacer referencia a la variable con una sintaxis con el formato matObj.varName sin indexar. Ambas acciones cargan temporalmente todo el contenido de la variable en la memoria. Con variables muy grandes, la carga lleva mucho tiempo y puede generar un error Out of Memory. En su lugar, utilice el método size para objetos MatFile a fin de encontrar el tamaño de la variable y, luego, indexe en la parte deseada de la variable.

Por ejemplo, cree un objeto MatFile para una matriz aleatoria B de 100 por 100.

B = rand(100);
save example.mat B -v7.3
clear B
exampleObject = matfile("example.mat");

Supongamos que no conoce el tamaño de esta variable, pero desea cargar su última columna en el área de trabajo. Para evitar cargar toda la variable en la memoria, utilice primero el método size para objetos MatFile (en lugar de utilizar la función size) a fin de obtener el tamaño de la variable.

[nrows,ncols] = size(exampleObject,'B');

Luego, utilice ncols para indexar en la variable a fin de cargar la última columna de B en el área de trabajo sin cargar toda la variable en la memoria.

lastColB = exampleObject.B(:,ncols);

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 crea un archivo MAT que admite cargar y guardar de manera parcial.

newfileObject = matfile("newfile.mat");

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 la configuración para guardar archivos nuevos con el formato de la versión 7.3, vaya a la pestaña Home y, en la sección Environment, haga clic en Settings. Seleccione MATLAB > General > MAT and FIG Files y, después, seleccione una de las opciones disponibles.

Consulte también

| |

Temas