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 代表固体材料。(某种离散化来表示一个球体,重点是,使用这个数组乘以其他数组(保持一个速度场),所以在哪里是固体速度将有一个零值)

我尝试了其他方法,将一维数组中的数据展平并将其传递给数组的构造函数,但在最好的情况下,我恢复了 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),如果数据正确保存在这个数组(对象)中,但没有保存在 ArrayFire 对象中……我不知道为什么。

编辑 2:

我试试这个,使用一维内存的指针:

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); 

知道 de 3D object[][][] 数组,有正确的信息!

但是 ArrayFire 对象 af_obj 不是,正如我之前所说的数组代表一个球体,在最好的情况下 ArrayFire 对象显示 3 个球体(不知道为什么)。嵌套 fors 的顺序很重要,我尝试所有可能的 xyz 组合,但似乎没有任何效果。

4

0 回答 0