Назначение в многомерных массивах Xtensor

Я использую библиотеку Xtensor для C ++.

У меня есть массив xt :: zeros ({n, n, 3}), и я хотел бы назначить его элемент i, j, элемент xt :: xarray {,,}, чтобы он сохранял трехмерный вектор в каждом (I, J). Однако в документации не упоминается присваивание значений — я вообще не могу понять из документации, как работают массивы с несколькими coodinates.

То, что я пытался это

   xt::xarray<double> force(Body body1, Body body2){
// Function to calulate the vector force on body2 from
// body 1

xt::xarray<double> pos1 = body1.get_position();
xt::xarray<double> pos2 = body2.get_position();

// If the positions are equal return the zero-vector
if(xt::all(xt::equal(pos1, pos2))) {
return xt::zeros<double>({1, 3});
}

xt::xarray<double> r12 = pos2 - pos1;
double dist = xt::linalg::norm(r12);

return -6.67259e-11 * body1.get_mass() * body2.get_mass()/pow(dist, 3) * r12;
}

xt::xarray <double> force_matrix(){
// Initialize the matrix that will hold the force vectors
xt::xarray <double> forces = xt::zeros({self_n, self_n, 3});

// Enter the values into the force matrix
for (int i = 0; i < self_n; ++i) {
for (int j = 0; j < self_n; ++j)
forces({i, j}) = force(self_bodies[i], self_bodies[j]);
}
}

Там, где я пытаюсь назначить вывод функции силы в качестве ij’-й координаты в массиве сил, но это, похоже, не работает.

1

Решение

В xtensor присвоение и индексация многомерных массивов довольно проста. Есть два основных способа:

Либо указатель с круглыми скобками:

xarray<double> a = xt::zeros({3, 3, 5});
a(0, 1, 3) = 10;
a(1, 1, 0) = -100; ...

или с помощью xindex тип (который на данный момент является std :: vector) и квадратные скобки:

xindex idx = {0, 1, 3};
a[idx] = 10;
idx[0] = 1;
a[idx] = -100; ...

Надеюсь, это поможет.

2

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

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

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