2

4 つの列 ("g_Grid.r"、"g_Grid.t"、"g_Grid.b"、"g_Grid.ph") を持つマトリックスを記述する必要があります。

通常、ファイル ストリームを使用してファイルに書き込みます。

ofstream fout; 
fout.open("GRID.dat");
 for (int m=0;m<N_PH;++m)
    {   
    for (int k=0;k<N_B;++k)
        {
          for (int j=0;j<N_T;++j)
            {   
            for (int i=0;i<N_R;++i)
                {
                  fout << setprecision(32) << g_Grid.r[i]<<" "<<g_Grid.t[j]<<" "<<g_Grid.b[k]<<" "<<g_Grid.ph[m]<< endl;

                }
            }
        }
    }
 fout.close();

正常に動作しますが、現在、非常に大きな (長い) マトリックスを扱っており、フォーマットされた出力 (".txt") を書き込むのに時間がかかります。ファイルをフォーマットする必要は本当にないので、バイナリファイルとして書き込むことを好みます。

質問: 4 つのベクトル/配列 (r、t、b、ph) が与えられた場合、テーブルをバイナリ ファイルに書き込む方法は? (後でこのファイルを読み取るために matlab を使用し、バイナリ テーブルとして読み取る必要もあります)

編集

通常、次の単純なコードを使用してバイナリ ファイルを書き込みます。

ofstream myFile (fileName, ios::out | ios::binary);
double val;
for (int m=0;m<N_PH;++m)
    {   
    for (int k=0;k<N_B;++k)
        {
          for (int j=0;j<N_T;++j)
            {   
            for (int i=0;i<N_R;++i)
                {
                  val = g_N.Amp[m][k][j][i];
                  myFile.write(reinterpret_cast<const char*>(&val), sizeof(val));
                }
            }
        }
    }
myFile.close();

しかし、これは後でmatlabによって読み取られる間、「1列」しか得られません。

4

1 に答える 1

5

バイナリ データをファイルに書き込むには、まずファイルをバイナリ モードで開く必要がありますfstream::write。引数を取り、char *そこからいくつかのバイトを書き込みます。データが の配列またはへのポインタchar *でない場合、引数にはキャストが必要です。charchar

複数回の書き込み呼び出しを避けるために、データを構造体に詰め込むことをお勧めします。

したがって、次のようにして必要なことを行う必要があります。

ofstream fout; 
fout.open("GRID.dat", ios::binary);
 for (int m=0;m<N_PH;++m)
    {   
    for (int k=0;k<N_B;++k)
        {
          for (int j=0;j<N_T;++j)
            {   
            for (int i=0;i<N_R;++i)
                {
                  struct X
                  {
                      double a, b, c, d;
                  } x;

                  x.a = g_Grid.r[i];
                  x.b = g_Grid.t[j];
                  x.c = g_Grid.b[k];
                  x.d = g_Grid.ph[m];
                  fout.write(reinterpret_cast<char *>(&x), sizeof(x));
                }
            }
        }
    }
 fout.close();
于 2013-06-12T08:55:46.470 に答える