Program Matlab nie odczytuje określonej liczby elementów z pliku. Mam prosty program, który musi czytać w dwóch plikach, wykonać liniową operację na danych i zapisać połączony wynik do trzeciego pliku.Dlaczego funkcja MATLAB nie może poprawnie odczytać plików binarnych?
Moje pytania to: 1) Dlaczego Matlab nie odczytuje określonej liczby elementów i 2) czy istnieje obejście tego problemu? Dowolne Twoich myśli będzie pomocne.
Niektóre szczegóły dotyczące plików wejściowych:
- są duże (~ 18PL)
- oba są tej samej wielkości (dokładnie)
Szczegóły dotyczące procedury (2-4 są uwarunkowane sprawdzeniem obu plików: wyboru obu plików:
- Otwórz pliki wejściowe i wyjściowe do odczytu i w riting (odp.)
- Czytaj w
N
pływaków (N * 4 bajty) z każdego wejścia plików - Wykonywanie operacji na danych (powiedzmy 0,5 * (datin1 + datin2))
- Wpisz wynik plik wyjściowy.
To wszystko jest bardzo proste i w większości przypadków w przeszłości działało dobrze. Niestety, w pewnym momencie cyklu, MATLAB nie dostać wszystkie N
pływaków z jednego z plików i daje błąd wymiar macierzy w kroku 3.
KOD ciach:
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
Update 1 komunikat o błędzie odbieram to:
???Error using ==> plus
Matrix dimension must agree.
UPDATE 2 I po sugestia Nd zawierał sprawdzenia po każdym przeczytaniu i magiczny problem zniknął. Więc teraz modyfikacja moich pytań: Co może być przyczyną problemu? Czy jest to po prostu kwestia czasu lub błąd?
Oto fragment zaktualizowanego kodu (pokazujący tylko część kodu). Jestem pewien, że są lepsze sposoby na zrobienie tego. Niezależnie od tego dodanie tych sprawdzeń pozwoliło Matlabowi na dokończenie wszystkich odczytów z każdego z plików.
[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');
Czy możesz podać dokładny komunikat o błędzie, który otrzymujesz? –
Czy oba pliki znajdują się na wewnętrznym dysku twardym? i na jakim systemie operacyjnym jesteś? Matlab 32 lub 64-bitowy? –
@ Andrew, 'Błąd przy użyciu ==> plus ...Wymiary matrycy muszą się zgadzać ". – ephsmith