2011-08-10 17 views
7

Matlab no está logrando leer en el número especificado de elementos de un archivo. Tengo un programa simple que necesita leer en dos archivos, realizar una operación lineal en los datos y escribir un resultado combinado en un tercer archivo.¿Por qué MATLAB no puede leer correctamente en archivos binarios?

Mis preguntas son: 1) ¿Por qué Matlab no puede leer el número especificado de elementos y 2) hay una solución para esto? Cualquier de sus pensamientos será útil.

Algunos detalles sobre los archivos de entrada:

  • son grandes (~ 18GB)
  • ambos son del mismo tamaño (exactamente)

detalles sobre el procedimiento (2-4 están condicionadas en una feof cheque de ambos archivos:

  1. abrir los archivos de entrada y salida para la lectura y w riting (resp.)
  2. Leer en N flotadores (N * 4 bytes) de cada uno de los archivos de entrada
  3. realizar una operación en los datos (por ejemplo 0,5 * (datin1 + datin2))
  4. grabar el resultado en el archivo de salida.

Concedido, esto es todo muy simple y en la mayoría de los casos esto ha funcionado bien en el pasado. Por desgracia, en algún punto del ciclo, MATLAB no recibe todos los N flotadores de uno de los archivos y da un error de la dimensión de la matriz en el paso 3.

CÓDIGO SNIP:

N = 2048; 
fidin1 = fopen('file1.dat','r','l'); 
fidin2 = fopen('file2.dat','r','l'); 
fidout = fopen('outfile.dat','w','l'); 

%# I could do some assertions on the file sizes, 
%# but I know they are the same size (w/o question). 

while(~feof(fidin1) && ~feof(fidin2)) 
    datin1 = fread(fidin1,N,'float=>single',0,'l'); 
    datin2 = fread(fidin2,N,'float=>single',0,'l'); 

    %# the following line produces an error after 100 
    %# or more iterations in to the procedure 
    datout = 0.5*(datin1+datin2); 
    fwrite(fidout,datout,'float',0,'l'); 
end 

ACTUALIZA 1 El mensaje de error que estoy recibiendo es:

???Error using ==> plus 
Matrix dimension must agree. 

ACTUALIZACIÓN 2 he seguido una sugerencia de una nd incluyó ferror verificaciones después de cada lectura y mágicamente el problema desapareció. Así que ahora una modificación a mis preguntas: ¿Cuál podría ser la raíz del problema aquí? ¿Es esto simplemente un problema de tiempo o error?

Aquí hay un fragmento del código actualizado (que muestra solo una parte del código). Estoy seguro de que hay mejores formas de hacerlo. De todos modos, la adición de estos controles permitió a Matlab completar con éxito todas las lecturas de cada uno de los archivos.

[datin1 count1]= fread(fidin1,N,'float=>single',0,'l'); 
    [msg errn1]=ferror(fidin1); 
    if errn1 
     pos1 = ftell(fidin1); 
     error('Error at Position %d in file. %d bytes were read.',... 
      pos1,count1); 
    end 

    [datin2 count2]= fread(fidin2,N,'float=>single',0,'l'); 
    [msg errn2]=ferror(fidin2); 
    if errn2 
     pos2 = ftell(fidin2); 
     error('Error at Position %d in file. %d bytes were read.',... 
      pos2,count2); 
    end 

    %# the following line produces an error after 100 
    %# or more iterations in to the procedure 
    datout = 0.5*(datin1+datin2); 
    fwrite(fidout,datout,'float',0,'l'); 
+1

¿Puede incluir el mensaje de error exacto que está recibiendo? –

+0

¿Ambos archivos están en un disco duro interno? y en qué sistema operativo estás? ¿Matlab de 32 o 64bit? –

+0

@ Andrew, 'Error al usar ==> más ...Las dimensiones de la matriz deben estar de acuerdo'. – ephsmith

Respuesta

1

¿Ha observado de forma específica en el datin1 y datin2 variables al momento en que ocurre el error? Intente ir a 'Depurar -> Detener si hay errores/advertencias ...' y luego seleccione 'Siempre detener si hay error (dstop si hay error)'. Ejecuta tu programa y luego, una vez que falla, mira datin1 y datin2. Con suerte, eso explicará por qué agregarlos ahora está funcionando.

+0

Eso es nuevo para mí. Gracias por señalar este enfoque. Como resultado, el error es intermitente con archivos de gran tamaño. Tal vez este enfoque me ayude a descubrir por qué. Mi solución actual ha sido escribir segmentos de archivos que son mucho más pequeños. Desde que hice este cambio, no se han producido errores, lo que me lleva a pensar que se trata de un problema de tamaño de archivo. – ephsmith

Cuestiones relacionadas