2017-07-17 9 views
1

私はC++用のXtensorライブラリを使用しています。高次元Xtensor配列の割り当て

私はxt :: zeros({n、n、3})配列を持っており、そのi、j要素にxt :: xarray {、、}を割り当てて3D各(i、j)における3次元ベクトルである。しかし、ドキュメントには値の割り当ては言及されていません - 私は一般的に、複数の座標を持つ配列がどのように機能するかをドキュメントから理解することはできません。私がしようとしている何

は、私はij'thが力配列の座標として力関数の出力を割り当てるためにしようとしているが、それが動作するようには思えないこの

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]); 
     } 
    } 

です。

+0

注意:forceの要素 '(i、j)'に対するアクセス演算子は 'forces(i、j)'ではなく 'forces(i、j)'です。 – Quant

答えて

1

xtensorでは、多次元配列への割り当てとインデックス作成は非常に簡単です。

いずれ丸括弧付き指数:

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

又は(現時点ではstd ::ベクトルである)xindexタイプを使用することにより、角括弧:

二つの主な方法があります。
xindex idx = {0, 1, 3}; 
a[idx] = 10; 
idx[0] = 1; 
a[idx] = -100; ... 

希望があれば

関連する問題