我需要找到一种从文件中加载 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 组合,但似乎没有任何效果。