2011-08-10 20 views
7

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:

  1. Otwórz pliki wejściowe i wyjściowe do odczytu i w riting (odp.)
  2. Czytaj w N pływaków (N * 4 bajty) z każdego wejścia plików
  3. Wykonywanie operacji na danych (powiedzmy 0,5 * (datin1 + datin2))
  4. 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'); 
+1

Czy możesz podać dokładny komunikat o błędzie, który otrzymujesz? –

+0

Czy oba pliki znajdują się na wewnętrznym dysku twardym? i na jakim systemie operacyjnym jesteś? Matlab 32 lub 64-bitowy? –

+0

@ Andrew, 'Błąd przy użyciu ==> plus ...Wymiary matrycy muszą się zgadzać ". – ephsmith

Odpowiedz

1

Czy w momencie pojawienia się błędu dokładnie sprawdziłeś zmienne datin1 i datin2? Spróbuj przejść do "Debuguj -> Zatrzymaj, jeśli błędy/ostrzeżenia ...", a następnie wybierz "Zawsze zatrzymaj, jeśli błąd (dstop, jeśli błąd)". Uruchom program, a gdy się zawiesza, spójrz na datin1 i datin2. Mam nadzieję, że to wyjaśni, dlaczego dodanie ich razem działa.

+0

To dla mnie nowość. Dziękuję za wskazanie tego podejścia. Jak się okazuje, błąd jest sporadyczny w przypadku dużych plików. Może to podejście pomoże mi zrozumieć dlaczego. Moje obecne rozwiązanie polegało na wypisywaniu segmentów plików, które są znacznie mniejsze. Ponieważ dokonałem tej zmiany, nie wystąpiły żadne błędy, co prowadzi do przekonania, że ​​jest to problem z rozmiarem pliku. – ephsmith

Powiązane problemy