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:
- abrir los archivos de entrada y salida para la lectura y w riting (resp.)
- Leer en
N
flotadores (N * 4 bytes) de cada uno de los archivos de entrada - realizar una operación en los datos (por ejemplo 0,5 * (datin1 + datin2))
- 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');
¿Puede incluir el mensaje de error exacto que está recibiendo? –
¿Ambos archivos están en un disco duro interno? y en qué sistema operativo estás? ¿Matlab de 32 o 64bit? –
@ Andrew, 'Error al usar ==> más ...Las dimensiones de la matriz deben estar de acuerdo'. – ephsmith