2

Matlabの4D配列にfloatとして読み取りたいフォーマットされていない(バイナリだと思う)データの.imgファイルがあります。バイナリデータの読み取りに使用される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

最後の行はデータ(データに固有のもの)を反転することであり、私がそれを含めた唯一の理由は、それがバグの原因である場合に備えてです。

とにかく、この関数は私に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と比較すると、配列の最小値、最大値、および平均値はすべて異なります。2つのケースで何が異なって行われているのか、またはバイナリデータをMatlabの4D配列に読み込むためのより自然な方法についてのアイデアはありますか?

ところで、Matlab関数でループの順序を切り替えると(のor k= 1:dim3, for l= 1:dim4, ...代わりにf for l= 1:dim4, for k= 1:dim3, ...)、正しい最小値と最大値が得られますが、平均値は間違っています(これは以前と同じ平均値です)。

IDLスニペットの動作をMatlabに取り込むための助けをいただければ幸いです。

4

1 に答える 1

2

を使用してデータにアクセスしたいのですがfread、1D または 2D 配列しか読み取ることができないため、データを 1D 配列としてロードすることをお勧めします。データを 1D 配列として取得したら、次元がどうあるべきかを知っている限り、1D 配列でreshape関数を呼び出して、適切なサイズの 4D 配列として再フォーマットすることができます。

于 2011-06-22T21:56:51.173 に答える