Загрузить ArrayFire Array из файла

мне нужно найти способ загрузить массив 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 и ничего не работает.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]