在高维 Xtensor 数组中赋值

Posted

技术标签:

【中文标题】在高维 Xtensor 数组中赋值【英文标题】:Assigning in high-dimensional Xtensor arrays 【发布时间】:2017-07-17 01:51:35 【问题描述】:

我正在使用 C++ 的 Xtensor 库。

我有一个 xt::zeros(n, n, 3) 数组,我想为其 i, j, 元素分配一个 xt::xarray , , 以便它存储 3D 维度每个 (i, j) 处的向量。但是文档没有提到赋值 - 我通常无法从文档中弄清楚具有多个坐标的数组是如何工作的。

我一直在尝试的是这个

   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 个坐标,但这似乎不起作用。

【问题讨论】:

快速说明:力的元素(i, j) 的访问运算符是forces(i, j) 而不是forces(i, j) 【参考方案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】:

您也可以使用view 来实现。

在内部循环中,您可以这样做:

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

【讨论】:

以上是关于在高维 Xtensor 数组中赋值的主要内容,如果未能解决你的问题,请参考以下文章

python—Tensor(张量)的含义,创建

PyTorch框架学习 — Tensor(张量)详解

pytorch 中的存储方式

PyTorch : 了解Tensor(张量)及其创建方法

张量(Tensor)标量(scalar)向量(vector)矩阵(matrix)

Pytorch深度学习基础之Tensor