Eigen:Avoid 使用 for 循环
Eigen:Avoid using for loop
在下面的代码中,我想实现一行代码,而不是使用 for 循环,该代码将使用 Eigen 库函数并帮助代码本身的矢量化,从而使通过 OpenMP 的并行化变得容易。
Eigen::VectorXd get_vector(int n, int j , int start){
Eigen::VectorXd foo(n);
indices = Eigen::VectorXd::LinSpaced(n, start + n - 1, start).array();
for(int i =0;i<indices.size();i++)
foo(i) = (array(indices(i)) - array(j))*(array(indices(i)) - array(j));
return foo;
}
// array is globally declared as Eigen::VectorXd and have length greater than n, it is already been defined.(set of N(>n) random double numbers)
假设 array
是一个 VectorXd
并且您不需要 indices
在您的函数之外:
return (array.segment(start, n).array() - array(j)).square();
并且您应该考虑返回 ArrayXd
而不是 VectorXd
。
如果array
实际上是一个ArrayXd
,你可以省略.array()
。
在下面的代码中,我想实现一行代码,而不是使用 for 循环,该代码将使用 Eigen 库函数并帮助代码本身的矢量化,从而使通过 OpenMP 的并行化变得容易。
Eigen::VectorXd get_vector(int n, int j , int start){
Eigen::VectorXd foo(n);
indices = Eigen::VectorXd::LinSpaced(n, start + n - 1, start).array();
for(int i =0;i<indices.size();i++)
foo(i) = (array(indices(i)) - array(j))*(array(indices(i)) - array(j));
return foo;
}
// array is globally declared as Eigen::VectorXd and have length greater than n, it is already been defined.(set of N(>n) random double numbers)
假设 array
是一个 VectorXd
并且您不需要 indices
在您的函数之外:
return (array.segment(start, n).array() - array(j)).square();
并且您应该考虑返回 ArrayXd
而不是 VectorXd
。
如果array
实际上是一个ArrayXd
,你可以省略.array()
。