Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Guardar y cargar partes de variables en archivos MAT

Puede guardar y cargar partes de variables directamente en archivos MAT sin cargarlas en la memoria utilizando la función.matfile La principal ventaja de usar la función sobre las funciones o es que puede procesar partes de conjuntos de datos muy grandes que, de lo contrario, son demasiado grandes para caber en la memoria.matfileloadsave Cuando trabaje con estas variables de gran tamaño, lea y escriba la mayor cantidad de datos posible en la memoria a la vez. De lo contrario, el acceso repetido a archivos puede afectar negativamente al rendimiento del código.

Guardar y cargar mediante la funciónmatfile

En este ejemplo se 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 de la versión 7,3 con dos variables y.AB

A = rand(5); B = magic(10); save example.mat A B -v7.3; clear A B

Construya un objeto desde el archivo MAT,.MatFileexample.mat La función crea un objeto que corresponde al archivo MAT y contiene las propiedades del objeto.matfileMatFileMatFile De forma predeterminada, solo permite cargar desde archivos MAT existentes.matfile

exampleObject = matfile('example.mat');

Para habilitar el guardado, llame con el parámetro.matfileWritable

exampleObject = matfile('example.mat','Writable',true);

Alternativamente, construya el objeto y establezca en pasos separados.Properties.Writable

exampleObject = matfile('example.mat'); exampleObject.Properties.Writable = true;

Cargue la primera fila de desde en variable y modifique los datos.Bexample.matfirstRowB Cuando se indexa en objetos asociados a la versión 7,3 MAT-files, MATLAB® carga solo la parte de la variable que se especifique.

firstRowB = exampleObject.B(1,:);  firstRowB = 2 * firstRowB;

Actualice los valores de la primera fila de la variable en el uso de los valores almacenados en.Bexample.matfirstRowB

exampleObject.B(1,:) = firstRowB;

Para archivos muy grandes, la mejor práctica es leer y escribir la mayor cantidad de datos en la memoria como sea posible a la vez. De lo contrario, el acceso a archivos repetidos repercute negativamente en el rendimiento del código. Por ejemplo, supongamos que el archivo contiene muchas filas y columnas, y que la carga de una sola fila requiere la mayor parte de la memoria disponible. En lugar de actualizar un elemento a la vez, actualice cada fila.

[nrowsB,ncolsB] = size(exampleObject,'B'); for row = 1:nrowsB   exampleObject.B(row,:) = row * exampleObject.B(row,:); end

Si la memoria no es un problema, puede actualizar todo el contenido de una variable a la vez.

exampleObject.B = 10 * exampleObject.B;

Alternativamente, actualice una variable llamando a la función con la opción.save-append La opción solicita que la función Reemplace solo la variable especificada y deje intactas otras variables en el archivo.-appendsaveB Este método siempre requiere que cargue y guarde la variable completa.

load('example.mat','B'); B(1,:) = 2 * B(1,:); save('example.mat','-append','B');

Añada una variable al archivo utilizando el objeto.matlab.io.MatFile

exampleObject.C = magic(8);

También puede Agregar la variable llamando a la función con la opción.save-append

C = magic(8); save('example.mat','-append','C'); clear C

Cargue partes de variables dinámicamente

Este ejemplo muestra cómo acceder dinámicamente a partes de variables de un archivo MAT. Esto es útil cuando se trabaja con archivos MAT cuyas variables nombres no siempre se conocen.

Considere el ejemplo de archivo MAT, que contiene una o varias matrices con nombres desconocidos.topography.mat Construya un objeto que corresponda al archivo,.MatFiletopography.mat Llame para obtener los nombres de variable en el archivo.who

exampleObject = matfile('topography.mat'); varlist = who(exampleObject)
varlist = 4x1 cell array
    {'topo'      }
    {'topolegend'}
    {'topomap1'  }
    {'topomap2'  }

es una matriz de celdas que contiene los nombres de las cuatro variables en.varlisttopography.mat

La tercera y cuarta variables, y, son ambas matrices que contienen datos topográficas.topomap1topomap2 Cargue los datos de elevación de la tercera columna de cada variable en un campo de la matriz de estructura,.S Para cada campo, especifique un nombre de campo que sea el nombre de variable original con el prefijo.elevationOf_ A continuación, acceda a los datos de cada variable como propiedades de.exampleObject Porque es una variable, enciérrela entre paréntesis.varName

for index = 3:4     varName = varlist{index};     S(1).(['elevationOf_',varName]) = exampleObject.(varName)(:,3); end

Ver el contenido de la matriz de estructura,.S

S
S = struct with fields:
    elevationOf_topomap1: [64x1 double]
    elevationOf_topomap2: [128x1 double]

tiene dos campos y cada uno contiene un vector de columna.SelevationOf_topomap1elevationOf_topomap2

Evite cargar accidentalmente variables enteras

Si no conoce el tamaño de una variable grande en un archivo MAT y desea cargar solo partes de esa variable a la vez, evite usar la palabra clave.end El uso de la palabra clave carga temporalmente todo el contenido de la variable en cuestión en la memoria.end Para variables muy grandes, la carga tarda mucho tiempo o genera errores.OutofMemory En su lugar, llame al size método para los objetos.MatFile

Por ejemplo, este código carga temporalmente todo el contenido de la memoria:B

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 se refiere a una variable con la sintaxis del formulario, como, carga temporalmente toda la variable en la memoria.matObj.varNameexampleObject.BMATLAB® Por lo tanto, asegúrese de llamar al método para objetos con sintaxis como:sizeMatFile

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

en lugar de pasar todo el contenido de la función,exampleObject.Bsize

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

La diferencia en la sintaxis es sutil, pero significativa.

Carga y ahorro parciales requiere la versión 7,3 MAT-files

Cualquier operación de carga o de guardado que utilice un objeto asociado con un archivo MAT de la versión 7 o anterior carga temporalmente toda la variable en la memoria.MatFile

Utilice la función para crear archivos en formato versión 7,3.matfile Por ejemplo, este código

newfile = matfile('newfile.mat'); 

crea un archivo MAT que admite la carga y el guardado parciales.

Sin embargo, de forma predeterminada, la función crea archivos MAT de la versión 7.save Convierta los archivos MAT existentes a la versión 7,3 llamando a la función con la opción, por ejemplo:save-v7.3

load('durer.mat'); save('mycopy_durer.mat','-v7.3');

Para cambiar sus preferencias para guardar nuevos archivos en formato versión 7,3, acceda a la sección de la pestaña y haga clic enEnvironmentHome .Preferences Seleccione MATLAB > General > MAT-Files. Esta preferencia no está disponible en MATLABOnline™.

Consulte también

| |

Temas relacionados