我必须用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;
}
我可以编译它,但是当我运行这个程序时,我得到了这个错误:
动态:/usr/include/eigen/src/core/densecoeffsbase.h:425:eigen::densecoeffsbase::scalar&;Eigen::DenseCoeffsBase::Operator()(Eigen::Index)[with Derived=Eigen::Matrix;Eigen::DenseCoeffsBase::Scalar=Double;Eigen::Index=int]:断言索引&>0&&索引(<);“size()'失败。阿布盖布罗欣
我知道我可以使用std::vector类轻松实现这一点,但是我想用eigen来实现,因为之后我必须做很多矩阵运算。
谢谢!
编辑:对于我的应用程序,我在编译时不知道向量的大小。我想知道Eigen中是否存在类似
你忘了为矢量保留空间。这对于
试试这个
#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';
}
正如@maikel建议我的那样。我可以用调整大小函数解决我的问题,如下所示;
#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()方法为非运算;否则它是破坏性的:系数的值可能会改变。如果您希望resize()的保守变体不改变系数,请使用conservatieResize()。”
因此,使用conservativeResize()可以更好地确保值不会丢失。