在Matlab中读取一个大的结构化文件

时间:2012-01-30 23:27:21

标签: matlab file-io binaryfiles

在matlab中,我想从一个结构化的,相当大的文件(大小:18 + 2048 * 2048字节)中读取,其中18个拳头字节被分配给标题,其余的是像素图像强度。 这里关注的是速度。正如您在下面的代码中看到的,对文件的多次访问大大降低了性能。 您能否建议以更快的方式从文件中读取这些内容?例如读取缓冲区中的所有内容,我们可以使用“fread”函数读取它。

fid = fopen(fileName, 'r', 'b');     % 'r' readonly and 'b' big endian
a= fread(fid,1,'uint16');
b1= fread(fid,1,'uint32');
b2= fread(fid,1,'uint32');
c1= fread(fid,1,'uint32');
c2= fread(fid,1,'uint32');
img=zeros (...
for i= (b1 + 1) : (b2 + 1)
   for j= (c1 + 1) : (c2 + 1)
      img(i, j) = fread(fid,1,'uint16');
   end
end

3 个答案:

答案 0 :(得分:5)

只需计算b1,b2,c1和c2的总大小n,然后将其传递给单个fread(fid,n,'uint16')调用,而不是将其循环。然后在输出上调用reshape使其成为一个二维数组。

答案 1 :(得分:1)

您可以一次性读取图像数据。注意元素的顺序

img(b1+1:b2+1,c1+1:c2+1) = fread(fid, [c2-c1+1 b2-b1+1], 'uint16').';

要考虑的另一件事是将数据存储为uint16以避免整数转换为双倍:

img = zeros(s1, s2, 'uint16');
img(b1+1:b2+1,c1+1:c2+1) = fread(fid, [c2-c1+1 b2-b1+1], '*uint16').';

答案 2 :(得分:1)

似乎您可以像这样简单地阅读整个图像:

%... read header first so that file pointer is positioned at start of image data

M = b2 - b1 + 1; % width
N = c2 - c1 + 1; % height

[A, count] = fread(fid, [M, N], 'uint16');

if (count ~= M * N) % error check for number of elements read
    disp('Error reading image file');
end

img = zeros(...);
img(b1+1:b2+1, c1+1:c2+1) = A; % offset the image as necessary