2

我有一个未格式化(我认为是二进制)数据的 .img 文件,我想将其作为浮点数读取到 Matlab 中的 4D 数组中。我注意到 Matlab 中用于读取二进制数据的“fread”函数只能自动读入一维或二维数组,所以我尝试了这样的方法:

function fileArr4D= load4DFile(dim1, dim2, dim3, dim4, filename)

fileArr4D= zeros(dim1, dim2, dim3, dim4); %initialize array
fid= fopen(strcat('files/', filename));
for l= 1:dim4
    for k= 1:dim3
        fileArr4D(:, :, k, dim4)= fread(fid, [dim1, dim2], 'float');
    end
end
fclose(fid);
fileArr4D= flipdim(fileArr4D, 2); %flips along dimension 2 (of 4)

end

最后一行是翻转数据(特定于数据的东西),我包含它的唯一原因是它是错误的来源。

无论如何,这个函数给了我一个 4D 数组,但不是我想要的值。我实际上是在将一些代码从 IDL 翻译到 Matlab,而在 IDL 中,实现是:

pp=fltarr(dim1,dim2,dim3,dim4)
file='pathto/filename.img'
openr,1,file
readu,1,pp
pp=reverse(pp,2)
close,1

但是,将 Matlab 中的 fileArr4D 返回的数组与 IDL 中的 pp 进行比较,数组的最小值、最大值和平均值都不同。关于在这两种情况下的不同之处,或者在 Matlab 中将二进制数据读入 4D 数组的更自然的方法,有什么想法吗?

顺便说一句,如果我在 Matlab 函数中切换循环顺序(for k= 1:dim3, for l= 1:dim4, ...而不是for l= 1:dim4, for k= 1:dim3, ...),我会得到正确的最小值和最大值,但平均值是错误的(与以前的平均值相同)。

将不胜感激将 IDL 片段的行为导入 Matlab 的任何帮助。

4

1 回答 1

2

由于您想用来fread访问数据并且它只能读取一维或二维数组,我建议将数据作为一维数组加载。一旦您将数据作为一维数组,只要您知道维度应该是什么,您就可以调用reshape一维数组上的函数将其重新格式化为适当大小的四维数组。

于 2011-06-22T21:56:51.173 回答