0

ファイルから ArrayFire 配列をロードする方法を見つける必要があります。ファイルの形式はix iy iz valで、( ix, iy , iz) は値 val が必要な座標です。C++ の方法で (getline などを使用して) ファイルを開き、行を解析して、インデックスix、iy、izおよび値valを正しく取得します。

ファイルの反復処理を開始する前に、いつものように配列を作成します

af::array af_obj(Lx,Ly,Lz, f32);

次に、反復するときに、次のような行を使用して値を保存します。

af_obj( ix, iy ,iz ) = val

しかし、配列は情報を正しく保存しません。つまり、単純な三次元配列で同じことを行うと、正しい情報が保持されます。

ファイル内の情報は 1 と 0 で構成され、3D 空間を表します。1 は空気領域を表し、0 はソリッド マテリアルを表します。(球体を表現するためのある種の離散化、ポイント全体は、この配列を使用して他の配列(速度フィールドを保持)を乗算するため、固体の場合、速度はゼロ値になります)

私は他の方法を試し、データを 1D 配列に平坦化し、それを配列のコンストラクターに渡しましたが、最良の場合、1 つではなく 3 つの球を回復します (配列のサイズは : Lx = 300 、Ly=Lz です)。 =100 ) しかし、私はやりたいことをすることができません。ファイルに正しいデータが含まれていることは確かです。このファイルを他のコードから生成します(ファイルの形式を変更すると役立つ場合は、変更できます)

読んでくれてありがとう。

編集:

データを保存するには、これを使用します:

 std::ofstream file;
  file.open("solidRegion.dat");

  for( int iz  = 0 ; iz < this->Lz; iz++ ){
    for( int iy  = 0 ; iy < this->Ly; iy++){
      for( int ix = 0 ; ix < this->Lx ; ix++){
    file << ix << " " <<  iy << " " << iz << " " << grid[ix][iy][iz] << "\n";
      }}}
  file.close();

3D 配列グリッドには、ポイント (1 と 0) が含まれており、正しいデータがあることがわかっています。

そしてファイルをロードするには:

std::string line;
    af::array af_obj(Lx,Ly,Lz,f32);
    while( std::getline(file_h,line ) ){

      std::stringstream linestream(line);
      int x,y,z, o;
      linestream >> x >> y >> z >> o;
      af_obj(x,y,z) = o;
      object[x][y][z] = o;
    }

オブジェクト配列は古典的な c++ 3D 配列 (次元 Lx, Ly , Lz ) であり、データがこの配列 ( object ) に正しく保存されているが ArrayFire オブジェクトには保存されていない場合....理由はわかりません。

編集2:

1D メモリのポインターを使用して、これを試します。

int *h_o;
h_o = new int[Lx*Ly*Lz];
int i = 0;

for ( int k = 0 ; k < Lz ; k++)
  for( int ix = 0 ; ix < Lx ; ix++)
    for( int j = 0 ; j < Ly ; j++)
      {

        h_o[i] = object[ix][j][k];
        i++;
              }
    af::array af_obj(Lx, Ly ,Lz , h_o); 

3D object[][][] 配列が正しい情報を持っていることを知っている!

しかし、配列が球を表す前に言ったように、ArrayFireオブジェクトaf_objはそうではありません。最良の場合、ArrayFireオブジェクトは3つの球を示します(理由はわかりません)。ネストされた fors の順序が重要です。xyz の考えられるすべての組み合わせを試してみましたが、何も機能しないようです。

4

0 に答える 0