我想“保留”密集的Eigen :: MatrixXd,因为我事先无法知道行数。但是,“resize”函数会动态更改其地址及其值。有什么想法吗?
resize.cpp
#include <Eigen/Dense>
#include <iostream>
using namespace std;
using namespace Eigen;
int main(void) {
VectorXd m;
for (int i = 0; i < 5; i++) {
m.resize(m.size()+1);
m(i) = i;
cout << m << endl;
for (int j = 0; j < m.size(); j++) {
cout << &m(j) << endl;
}
}
return 0;
}
输出
0
0xb34010
0
1
0xb34010
0xb34018
0
1
2
0xb34010
0xb34018
0xb34020
5.80399e-317
4.94066e-324
2.122e-314
3
0xb34030
0xb34038
0xb34040
0xb34048
答案 0 :(得分:1)
您可以将resize
方法替换为conservativeResize
。这样可以保留重新分配情况下的现有值,这种情况确实会不时发生。为了保留所需的内存,只需提前保留所需的长度:
#include <Eigen/Dense>
#include <iostream>
using namespace std;
using namespace Eigen;
int main(void) {
int reserveSize = 50;
VectorXd m(reserveSize);
for (int i = 0; i < 65; i++) {
m.conservativeResize(i+1);
//m.resize(m.size()+1);
m(i) = i;
cout << m << endl;
for (int j = 0; j < m.size(); j++) {
cout << &m(j) << endl;
}
}
return 0;
}