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.

Leer de archivo asignado

En este ejemplo se muestra cómo crear dos mapas de memoria diferentes y, a continuación, leer de cada uno de los mapas con la sintaxis adecuada. A continuación, se muestra cómo modificar las propiedades de mapa y analizar los datos.

Puede leer el contenido de un archivo que ha asignado a la memoria utilizando los mismos comandos de MATLAB® que utiliza para leer variables del espacio de trabajo de MATLAB. Al acceder a la propiedad del mapa de memoria, el contenido del archivo asignado aparece como una matriz en el espacio de trabajo activo actualmente.Datos Para leer los datos que desea del archivo, simplemente indexe en la matriz. Para obtener un mejor rendimiento, copie el campo en una variable y, a continuación, lea el archivo asignado con esta variable:Datos

dataRef = m.Data;

for k = 1 : N

y(k) = dataRef(k);

end

Por el contrario, la lectura directa desde el objeto es más lenta:memmapfile

for k = 1 : N

y(k) = m.Data(k);

end

Leer de mapa de memoria como matriz numérica

En primer lugar, cree un archivo de datos de ejemplo denominado que contenga una matriz 5000-by-1 de números de punto flotante de precisión doble.records.dat

randData = gallery('uniformdata',[5000,1],0);  fileID = fopen('records.dat','w'); fwrite(fileID,randData,'double');  fclose(fileID);

Asigne 100 números de punto flotante de precisión doble del archivo a la memoria y, a continuación, lea una parte de los datos asignados. Cree el mapa de memoria,.m Especifique un valor de 1024 para iniciar el mapa 1024 bytes desde el inicio del archivo.Offset Especifique un valor de 100 para asignar valores de 100.Repeat

m = memmapfile('records.dat','Format','double', ...       'Offset',1024,'Repeat',100);

Copie la propiedad en una variable,.Datosd A continuación, mostrar el formato de.d

d = m.Data;  whos d
  Name        Size            Bytes  Class     Attributes    d         100x1               800  double               

Los datos asignados son una matriz de 800 bytes porque hay 100 valores, cada uno de los cuales requiere 8 bytes.double

Leer un conjunto seleccionado de números del archivo indexando en el vector,.d

d(15:20)
ans = 6×1

    0.8392
    0.6288
    0.1338
    0.2071
    0.6072
    0.6299

Leer de mapa de memoria como estructura no escalar

Asigne porciones de datos en el archivo, como una secuencia de varios tipos de datos.records.dat

Llame a la función para crear un mapa de memoria,.memmapfilem

  m = memmapfile('records.dat',  ...       'Format', {              ...          'uint16' [5 8] 'x';   ...          'double' [4 5] 'y' });

El parámetro indica tratar los primeros 80 bytes del archivo como una matriz de valores de 5 por 8, y los 160 bytes después de eso como una matriz de valores de 4 por 5.Formatmemmapfileuint16double Este patrón se repite hasta que se alcanza el final del archivo.

Copie la propiedad en una variable,.Datosd

d = m.Data
d = 166x1 struct array with fields:
    x
    y

es una matriz de estructura de elemento 166 con dos campos. es una matriz de estructura no escalar porque el archivo se asigna como una secuencia repetida de varios tipos de datos.dd

Examine una estructura de la matriz para mostrar el formato de cada campo.

d(3)
ans = struct with fields:
    x: [5x8 uint16]
    y: [4x5 double]

Lea el campo de esa estructura desde el archivo.x

d(3).x
ans = 5x8 uint16 matrix

   19972   47529   19145   16356   46507   47978   35550   16341
   60686   51944   16362   58647   35418   58072   16338   62509
   51075   16364   54226   34395    8341   16341   33787   57669
   16351   35598    6686   11480   16357   28709   36239    5932
   44292   15577   41755   16362   30311   31712   54813   16353

MATLAB formatea el bloque de datos como una matriz de valores de 5 por 8, según lo especificado por la propiedad.uint16Format

Lea el campo de esa estructura desde el archivo.y

d(3).y
ans = 4×5

    0.7271    0.3704    0.6946    0.5226    0.2714
    0.3093    0.7027    0.6213    0.8801    0.2523
    0.8385    0.5466    0.7948    0.1730    0.8757
    0.5681    0.4449    0.9568    0.9797    0.7373

MATLAB formatea el bloque de datos como una matriz de valores de 4 por 5.double

Modificar propiedades de mapa y analizar datos

Esta parte del ejemplo muestra cómo trazar la transformación de Fourier de los datos leídos de un archivo a través de un mapa de memoria. A continuación, modifica varias propiedades del mapa existente, lee desde una parte diferente del archivo de datos y traza un histograma a partir de esos datos.

Cree un archivo de ejemplo con nombre.double.dat

randData = gallery('uniformdata',[5000,1],0); fileID = fopen('double.dat','w'); fwrite(fileID,randData,'double');  fclose(fileID);

Cree un de 1.000 elementos de tipo, comenzando en el byte 1025o.memmapfile objectdouble

m = memmapfile('double.dat','Offset',1024,  ...       'Format','double','Repeat',1000);

Copie la propiedad en una variable,.Datosk A continuación, obtenga los datos asociados con el mapa y trace la FFT de los primeros 100 valores del mapa.

k = m.Data; plot(abs(fft(k(1:100))))

Esta es la primera vez que se hace referencia a los datos y es cuando tiene lugar la correlación real del archivo con el espacio de direcciones de MATLAB.

Cambie las propiedades del mapa, pero continúe utilizando el mismo archivo. Siempre que cambie el valor de una propiedad de asignación de memoria, MATLAB reasignará el archivo a la memoria.

m.Offset = 4096; m.Format = 'single'; m.Repeat = 800;

ahora es un objeto de 800 elementos de tipo.mmemmapfilesingle El mapa comienza ahora en el byte 4096th en el archivo,.records.dat

Lea de la porción del archivo que comienza en el byte 4096th, y calcule el valor máximo de los datos. Este comando asigna una nueva región y desasigna la región anterior.

X = max(m.Data)
X = single
    7.5449e+37

Consulte también

Temas relacionados