2016-12-06 3 views
1

Ниже приведена специальная функция для чтения MNIST data files.Понимание чтения файла MATLAB/Ocatave

function [tlab, tvec] = readmnist(datafn, labelfn) 
% function reads mnist data and labels 

fid = fopen(datafn, 'rb'); 
//open datafn in read and big-endian format. 
//returns a file-id 
if fid==-1 
    error('Error opening data file'); 
end; 

fseek(fid, 0, 'eof'); 
// Seek to the 0th byte from the end of the file. 
// In other words. Just go to the end of the file. 
// fid == the file to be accessed. 
// 'eof' == relative position. 
// 0 == bytes to be read. 

cnt = (ftell(fid) - 16)/784; 

fseek(fid, 16, 'bof'); 
//Move to the 16th byte from the beginning of file. 
tvec = zeros(cnt, 784); 
//returns a 2D cntx784 matrix of zeros. 

for i=1:cnt 
    im = fread(fid, 784, 'uchar'); 
    tvec(i,:) = (im(:)/255.0)'; 
end; 
fclose(fid); 
cnt 

fid = fopen(labelfn, 'rb'); 
if fid==-1 
    error('Error opening label file'); 
end; 
fseek(fid, 8, 'bof'); 
[tlab nel] = fread(fid, cnt, 'uchar'); 
if nel ~= cnt 
    disp('Not all elements read.'); 
end; 
fclose(fid); 
nel 

Не могли бы вы рассказать мне, что такое улов со следующей линией?

cnt = (ftell(fid) - 16)/784; 

Что здесь происходит? Что такое 784?

ответ

3

В соответствии с кодом tvec (данные считаются из файла), как известно, cnt x 784 и cnt неизвестно. Линия, которую вы вставили, решает для cnt.

Поскольку предыдущая строка заставляет указатель файла указывать на конец файла, ftell(fid) будет указывать текущую позицию в файле, которая в этом случае соответствует общему количеству байтов в файле. Затем они вычитают 16, потому что, по-видимому, первые 16 байтов не являются частью данных, представляющих интерес. Теперь мы знаем, что cnt * 784 = ftell(fid) - 16, поэтому для решения для cnt нам просто нужно разделить на 784.

Следующие строки затем перемещают указатель файла обратно в 17-й байт (начало данных), а затем проходят через 1:cnt, а затем читают в каждом 784-байтовом фрагменте с fread.

Смежные вопросы