保留密集特征矩阵

时间:2015-12-24 08:44:42

标签: c++ eigen

我想“保留”密集的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

1 个答案:

答案 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;
}