мне нужно найти способ загрузить массив ArrayFire из файла, файл имеет формат: икс ий из валь, где (ix, iy, iz) — координаты, в которых должно быть значение val. я открываю файл способом c ++ (с getline и т. д.) и разбираю строку, правильно получаю индексы ix, iy, iz и значение, вал
Перед тем, как начать итерацию файла, я создаю свой массив как обычно
af::array af_obj(Lx,Ly,Lz, f32);
затем, когда я перебираю, я использую такую строку, чтобы сохранить значения:
af_obj( ix, iy ,iz ) = val
но массив не сохраняет информацию правильно, я имею в виду, если я делаю то же самое с простым трехмерным массивом, он содержит правильную информацию.
Информация в файле представляет собой пакет из 1 с и 0 с, представляющий трехмерное пространство, где 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();
сетка трехмерного массива, содержит точки (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 ++ (размеры 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);
Зная, что массив де 3D объект [] [] [], имеет правильную информацию!
но объект ArrayFire af_obj не является, как я уже говорил ранее, массив представляет сферу, в лучшем случае объект ArrayFire показывает 3 сферы (понятия не имею, почему). Порядок вложенных fors имеет значение, купи я пробую все возможные комбинации xyz и ничего не работает.
Задача ещё не решена.
Других решений пока нет …