从文件

时间:2016-03-03 19:58:56

标签: c++ parallel-processing arrayfire

我需要找到一种从文件加载ArrayFire数组的方法,该文件的格式为: ix iy iz val ,其中(ix,iy,iz)是其中的坐标价值必须是。我以c ++方式打开文件(使用getline等)并解析该行,正确获取索引 ix,iy,iz 和值 val

在我开始迭代文件之前,我像往常一样创建我的数组

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

然后当我迭代时,我使用这样的一行来保存值:

af_obj( ix, iy ,iz ) = val

但数组没有正确保存信息,我的意思是如果我用一个简单的三维数组做同样的事情,它保持正确的信息。

文件中的信息是1和0的buch,表示3D空间,其中1表示空气区域,0表示固体材料。 (表示球体的某种离散化,整点是,使用这个数组乘以其他数组(保持速度场),所以在哪里是固体,速度将为零值)

我尝试过其他方法,将数据压缩成1D数组并将其传递给数组的构造函数,但在最好的情况下,我会恢复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:

我尝试使用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); 

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

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

0 个答案:

没有答案