通过运算符 * 和原始循环的 xarray 乘法给出不同的结果

xarray multiplication via operator * and raw loop give different results

我是 xtensor 的初学者,在下面的代码中,我认为变量 resultsum 应该相等但不是。在这个例子中 result == 1000sum == 55000。如果我比较 xt::transpose(x)*A*x 之类的操作及其原始循环实现(其中 A 具有与 x 兼容的形状),这两个变量也会有不同的结果。我应该如何使用 xtensor 操作以获得与原始循环相同的结果?

#include <stdio>
#include <cmath>
#include <xtensor/xarray.hpp>
#include <xtensor/xbuilder.hpp>
#include <xtensor/xstrided_view.hpp>

int main(int argc, char* argv[]){    
    xt::xarray<double> x = xt::ones<double>({10ul,1ul});
    xt::xarray<double> b = xt::zeros<double>({10ul,1ul});
    
    for(int i = 1; i <= 10; ++i){
        b(i-1,0) = 1000*i;
    }
    double result = (xt::transpose(b)*x)(0);
    double sum = 0;
    for(int i = 0; i < 10; ++i){
        sum += b(i,0)*x(i,0);
    }

    std::cout << result << " " << sum << "\n";
    return 0;
}

实例:https://godbolt.org/z/GMEeEzn8r(感谢 Daniel Langr 的评论)

下一行有一个小问题:

    double result = (xt::transpose(b)*x)(0);

很容易理解,您可能会假设向量的乘积给出点积的和,因为这是数学表达式会做的。然而,这不是 xtensor 所做的。 foxtensor,表达式只是两个向量的逐点乘积,不包括求和。

要获得正确的结果,请将行更改为

    double result = xt::sum(xt::transpose(b)*x)();