1

私はちょうどファイルを書き出しました:

 real*8                         :: vol_cel
 real*8, dimension(256,256,256) :: dense

[... some operations]

open(unit=8,file=fname,form="unformatted")
write(8)dense(:,:,:)/vol_cell
close(8)

Matlab でこれを読み取るための私のコード:

fid = fopen(fname,'r');
mesh_raw = fread(fid,256*256*256,'double');
fclose(fid);

最小値と最大値は、正しく読み取られていないことを明確に示しています (最小値は 0 で、最大値は大きな正の実数です*8)。

min =
   3.3622e+38
max =
  -3.3661e+38

フォーマットされていない Fortran ファイルで読み取るには、Matlab でどの精度を設定する必要がありますか?

やや関連する質問:私が使用しているこのMatlabコードは、バイナリファイルを正常に読み取りますが、フォーマットされていないファイルは読み取りません。gfortranを使用してMac OSXでこの新しいデータを生成していますが。form="binary" を認識しないので、そのようにはできません。ライブラリを追加する必要がありますか、それともエンディアンの問題ですか?

=====進捗状況=====

順調に進んでいます。ndim*ndim*ndim 行列の代わりに、x 値 (列ベクトル) を次のように書き出しました。

open(unit=8,file=fnamex,form="unformatted")
write(8)x0
close(8)

次に、Matlab は次のように読み取ります。

fid =    fopen(nfilename,'r');
hr3=fread(fid, 1, 'int32');
x0 = fread(fid,Ntot,'float32');
hr4=fread(fid, 1, 'int32');
fclose(fid);

それはうまくいきました。次に、元の ndim**3 マトリックスを試して、次のように読み込もうとしました。

fid =    fopen(nfilename,'r');
hr3=fread(fid, 1, 'int32');
mesh_raw = fread(fid,ndim*ndim*ndim,'float32');
hr4=fread(fid, 1, 'int32');
fclose(fid);

しかし、それは私にゴミを与えます。おそらくここ:

real*4,     dimension(:),   allocatable    :: x0
real*8,     dimension(256,256,256)         :: dense

変更する必要がありますか: mesh_raw = fread(fid,ndim*ndim*ndim,'float32'); それが本当の* 8を読んでいることを確認するには?それは何でしょう?確かに「real*8」を逐語的に使用するだけでうまくいくはずですか?x ベクトルが機能するための「real*4」を意味します。「密」と表示されていますが、最小値/最大値/平均値が間違っています。

4

3 に答える 3

1

これはエンディアンの問題である可能性が最も高く、大雑把な順序で推測すると、はるかに妥当な数値が得られます。正確な解決策がわからないので、3 つの可能な解決策を提示します。そのうちの 1 つが問題を解決するはずです。ソースファイルによって異なります。

fopen秘訣は、ステートメントを次のいずれかに変更するだけです。

fid = fopen(fname,'rn');  %Native format (Default usually)
fid = fopen(fname,'rl');  %Little Endian
fid = fopen(fname,'rb');  %Big Endian
于 2012-11-28T00:02:09.350 に答える