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:
- Mở tệp đầu vào và đầu ra để đọc và w riting (resp.)
- đọc trong
N
nổi (N * 4 byte) từ mỗi đầu vào tập tin - Thực hiện một thao tác trên dữ liệu (chẳng hạn 0,5 * (datin1 + datin2))
- 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');
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? –
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? –
@ Andrew, 'Lỗi khi sử dụng ==> cộng với ...Kích thước ma trận phải đồng ý'. – ephsmith