通过运算符 * 和原始循环的 xarray 乘法给出不同的结果
xarray multiplication via operator * and raw loop give different results
我是 xtensor 的初学者,在下面的代码中,我认为变量 result
和 sum
应该相等但不是。在这个例子中 result == 1000
和 sum == 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)();
我是 xtensor 的初学者,在下面的代码中,我认为变量 result
和 sum
应该相等但不是。在这个例子中 result == 1000
和 sum == 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)();