我有一个未格式化的(我认为是二进制)数据的.img文件,我希望将其作为浮点数读入Matlab中的4D数组。我注意到Matlab中用于读取二进制数据的'fread'函数只能自动读入1D或2D数组,所以我试过这样的事情:
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
最后一行是翻转数据(特定于数据的东西),我包含它的唯一原因是万一它是bug的来源。
无论如何,这个函数给了我一个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函数中切换循环的顺序(f or k= 1:dim3, for l= 1:dim4, ...
而不是for l= 1:dim4, for k= 1:dim3, ...
),我得到正确的最小和最大但是错误的意思(这与以前的意思相同) )。
任何帮助将IDL片段的行为引入Matlab的帮助都将非常感激。
答案 0 :(得分:2)
由于您想使用fread
来访问数据并且它只能读取1D或2D数组,我建议将数据加载为1D数组。将数据作为一维数组后,只要知道维度应该是什么,就可以调用1D数组上的reshape
函数将其重新格式化为适当大小的4D数组。 / p>