Optimization 特征:避免使用for循环
在下面的代码中,我没有使用for循环,而是希望实现一行代码,该代码将使用特征库函数,并有助于代码本身的矢量化,从而通过OpenMP简化并行化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<
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]是的,它起作用了。但我不明白为什么数组()是必需的?特征向量不支持标量减法吗?@user7440094Eigen::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]是的,它起作用了。但我不明白为什么数组()是必需的?特征向量不支持标量减法吗?@user7440094Eigen::Vector
和Eigen::Matrix
是数学对象,因此如果一个操作没有数学意义,通常不会实现。如果您想将Eigen::Vector
或Eigen::Matrix
视为一系列它的元素,然后您必须通过m.array()
明确地告诉Eigen。因此a*b!=a.array()*b.array()
从向量中减去标量必须作为数组来完成(并显式或隐式地转换回矩阵)因为从一个向量中减去一个标量,或者从一个矩阵中减去一个向量,等等,在数学上是没有意义的。