2011-08-10 65 views
7

Matlab không đọc được số phần tử được chỉ định từ một tệp. Tôi có một chương trình đơn giản mà cần phải đọc trong hai tập tin, thực hiện một hoạt động tuyến tính trên dữ liệu và viết một kết quả kết hợp vào một tập tin thứ ba.Tại sao MATLAB không đọc thành công trong tệp nhị phân?

Câu hỏi của tôi là: 1) Tại sao Matlab không đọc số phần tử được chỉ định và 2) có giải pháp cho việc này không? Bất kỳ suy nghĩ nào của bạn sẽ hữu ích.

Một số chi tiết về các tập tin đầu vào:

  • họ lớn (~ 18GB)
  • họ đều cùng kích thước (chính xác)

Chi tiết về thủ tục (2-4 được kiểm tra trên feof kiểm tra cả hai tệp:

  1. Mở tệp đầu vào và đầu ra để đọc và w riting (resp.)
  2. đọc trong N nổi (N * 4 byte) từ mỗi đầu vào tập tin
  3. Thực hiện một thao tác trên dữ liệu (chẳng hạn 0,5 * (datin1 + datin2))
  4. Viết kết quả để tệp đầu ra.

Được cấp, điều này rất đơn giản và trong hầu hết các trường hợp trong quá khứ điều này đã hoạt động tốt. Thật không may, tại một số điểm trong chu kỳ, MATLAB không có được tất cả N nổi từ một trong những tập tin và đưa ra một lỗi khía cạnh ma trận trên bước 3.

MÃ 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 

UPDATE 1 thông báo lỗi tôi nhận được là:

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

UPDATE 2 tôi đi theo một gợi ý một nd bao gồm kiểm tra ferror sau mỗi lần đọc và kỳ diệu sự cố đã biến mất. Vì vậy, bây giờ một sửa đổi cho câu hỏi của tôi: Điều gì có thể là gốc rễ của vấn đề ở đây? Đây có phải là vấn đề về thời gian hay lỗi không?

Đây là một snip của mã được cập nhật (chỉ hiển thị một phần của mã). Tôi chắc chắn có những cách tốt hơn để làm điều này. Bất kể, việc bổ sung các kiểm tra này cho phép Matlab hoàn thành tất cả các lần đọc từ mỗi tệp thành công.

[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

Bạn có thể đưa vào thông báo lỗi chính xác mà bạn đang nhận được không? –

+0

Có phải cả hai tệp trên đĩa cứng nội bộ không? và bạn đang sử dụng hệ điều hành nào? 32 hoặc 64bit MATLAB? –

+0

@ Andrew, 'Lỗi khi sử dụng ==> cộng với ...Kích thước ma trận phải đồng ý'. – ephsmith

Trả lời

1

Bạn đã xem xét cụ thể các biến datrong và datin2 tại thời điểm xảy ra lỗi? Hãy thử vào 'Debug -> Stop if Errors/Warnings ...' sau đó chọn 'Always stop if error (dstop if error)'. Chạy chương trình của bạn và sau đó một khi nó bị treo, hãy xem datin1 và datin2. Hy vọng rằng điều đó sẽ giải thích tại sao việc thêm chúng lại với nhau hiện đang hoạt động.

+0

Điều đó mới đối với tôi. Cảm ơn bạn đã chỉ ra cách tiếp cận này. Khi nó quay ra, lỗi là liên tục với các tập tin lớn. Có lẽ cách tiếp cận này sẽ giúp tôi hiểu tại sao. Giải pháp hiện tại của tôi là viết các phân đoạn tệp nhỏ hơn nhiều. Vì tôi đã thực hiện thay đổi này, không có lỗi nào xảy ra, khiến tôi tin rằng đây là vấn đề về kích thước tệp. – ephsmith

Các vấn đề liên quan