Optimization 特征:避免使用for循环

Optimization 特征:避免使用for循环,optimization,openmp,eigen,Optimization,Openmp,Eigen,在下面的代码中,我没有使用for循环,而是希望实现一行代码,该代码将使用特征库函数,并有助于代码本身的矢量化,从而通过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<

在下面的代码中,我没有使用for循环,而是希望实现一行代码,该代码将使用特征库函数,并有助于代码本身的矢量化,从而通过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)
Eigen::VectorXd get_vector(int n,int j,int start){
本征::矢量xd foo(n);
index=Eigen::VectorXd::LinSpaced(n,start+n-1,start).array();
对于(int i=0;in)随机双精度数)

假设
数组
是一个
向量xd
,您不需要在函数之外使用
索引

return (array.segment(start, n).array() - array(j)).square();

您应该考虑返回<代码> ArrayXd <代码>,而不是<代码> VECRTOXD 。


如果
array
实际上是一个
ArrayXd
,则可以省略
.array()

假设
array
是一个
VectorXd
并且在函数之外不需要
索引:

return (array.segment(start, n).array() - array(j)).square();

您应该考虑返回<代码> ArrayXd <代码>,而不是<代码> VECRTOXD 。


如果
array
实际上是一个
ArrayXd
,你可以省略
.array()

你的意思是
foo(i)=……
?什么是
array
?@chtz是的,我现在编辑了这个问题你的意思是
foo(i)=…
?什么是
array
?@chtz是的,我现在编辑了这个问题我的array是VectorXd,正如我所做的那样,它给了我一个错误,在进一步调试时,减法似乎给了我一个错误。知道为什么会发生这样的事情吗?错误是:::“运算符-”不匹配。“header/Eigen/src/Core/。/plugins/CommonCwiseUnaryOps.h:45:注意:候选项是:const-Eigen::CwiseUnaryOp-Eigen::MatrixBase::operator-()const[with-Derived=Eigen::Matrix]是的,它起作用了。但我不明白为什么数组()是必需的?特征向量不支持标量减法吗?@user7440094
Eigen::Vector
Eigen::Matrix
是数学对象,因此如果一个操作没有数学意义,通常不会实现。如果您想将
Eigen::Vector
Eigen::Matrix
视为一系列它的元素,然后您必须通过
m.array()
明确地告诉Eigen。因此
a*b!=a.array()*b.array()
从向量中减去标量必须作为数组来完成(并显式或隐式地转换回矩阵)因为从向量中减去标量或从矩阵中减去向量等都没有数学意义。我的数组是VectorXd,正如我所做的那样,它给了我一个错误,在进一步调试时,减法似乎给了我一个错误。知道为什么会发生这样的事情吗?错误是:::“与‘运算符-’不匹配。”header/Eigen/src/Core/。/plugins/CommonCwiseUnaryOps.h:45:注意:候选项是:const-Eigen::CwiseUnaryOp-Eigen::MatrixBase::operator-()const[with-Derived=Eigen::Matrix]是的,它起作用了。但我不明白为什么数组()是必需的?特征向量不支持标量减法吗?@user7440094
Eigen::Vector
Eigen::Matrix
是数学对象,因此如果一个操作没有数学意义,通常不会实现。如果您想将
Eigen::Vector
Eigen::Matrix
视为一系列它的元素,然后您必须通过
m.array()
明确地告诉Eigen。因此
a*b!=a.array()*b.array()
从向量中减去标量必须作为数组来完成(并显式或隐式地转换回矩阵)因为从一个向量中减去一个标量,或者从一个矩阵中减去一个向量,等等,在数学上是没有意义的。