在高维Xtensor数组中分配

时间:2017-07-17 01:51:35

标签: c++ arrays xtensor

我正在使用Ctensor库进行C ++。

我有一个xt :: zeros({n,n,3})数组,我想将它的i,j,元素分配为xt :: xarray {,,},以便它存储一个3D维度每个矢量(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]);
        }
    }

我试图将力函数的输出分配为力数组中的第i个坐标,但这似乎不起作用。

2 个答案:

答案 0 :(得分:2)

在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; ... 

希望有所帮助。

答案 1 :(得分:0)

您也可以使用view来实现。

在内部循环中,您可以执行以下操作:

xt::view(forces, i, j, xt::all()) = a_xarray_with_proper_size;