我必须使用EIGEN在for循环中填充带有值的向量。我正在尝试这样的事情......
#include <iostream>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;
int main(){
VectorXd s;
for (int i=0,i<10;i++){
s(i) = (double) i;
}
return 0;
}
我可以编译它,但是当我运行该程序时,我收到此错误:
dynamic:/usr/include/Eigen/src/Core/DenseCoeffsBase.h:425:Eigen :: DenseCoeffsBase :: Scalar&amp; Eigen :: DenseCoeffsBase :: operator()(Eigen :: Index)[with Derived = Eigen :: Matrix; Eigen :: DenseCoeffsBase :: Scalar = double; Eigen :: Index = int]:断言`index&gt; = 0&amp;&amp;指数&lt; size()'失败了。 Abgebrochen
我知道我可以使用std :: vector类轻松实现这一点,但我想用eigen做这个,因为之后我必须做很多矩阵运算。
谢谢!
编辑:对于我的应用程序,我不知道编译时矢量的大小。我想知道是否有类似于vector::push_back
的类似方法。
答案 0 :(得分:4)
你忘了为矢量预留空间。对于std::vector
,这是相同的。
试试这个
#include <Eigen/Dense>
#include <iostream>
int main()
{
// resize to 10 elements
auto vec = Eigen::VectorXd(10);
for (int i = 0; i < vec.size(); ++i) {
vec[i] = i;
}
std::cout << vec << '\n';
}
答案 1 :(得分:0)
@Maikel建议我。我可以用resize函数解决我的问题,如下所示;
#include <iostream>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen;
int main(){
VectorXd s;
for (int i=0,i<10;i++){
s.resize(i+1);
s(i) = (double) i;
}
return 0;
}
@Jonas让我意识到我知道循环前矢量的大小,所以我可以在循环之前调整一次。
关于Eigen文档中的resize函数可以找到:
&#34;如果实际矩阵大小没有改变,则resize()方法是无操作的;否则它是破坏性的:系数的值可能会改变。如果你想要一个不改变系数的保守变量resize(),请使用conservativeResize()&#34;
因此,当使用conservativeResize()确保值不会丢失时更好。