Eigen 中的 conservativeResize 和 resize 操作

  • 对于能够改变大小的动态矩阵,一般会有 resize() 操作。
  • resize() 如果不改变原矩阵的大小,则原矩阵大小和元素值都不会有改变,但是如果改变了原来矩阵的大小,则会调用矩阵的析构函数,导致矩阵的元素全部为0。
  • 如果想保存矩阵中的元素值,则可以调用 conservativeResize()函数即可。
#include <eigen3/Eigen/Core>
#include <eigen3/Eigen/Dense>
#include <iostream>

int main1(int argc, char const *argv[])
{
    Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> matrix;
    matrix.resize(2, 3);
    matrix << 1, 2, 3, 4, 5, 6;
    std::cout << matrix << std::endl;
    std::cout << "after resize: " << std::endl;
    matrix.resize(3,7); // resize 之后会调用析构函数,原先的值会变为0
    std::cout << matrix << std::endl;
    /*
    输出结果为:
    1 2 3
    4 5 6
    after resize: 
    0 0 0 0 0 0 0
    0 0 0 0 0 0 0
    0 0 0 0 0 0 0
    */
    return 0;
}

int main(int argc, char const *argv[])
{
    Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> matrix;
    matrix.resize(2, 3);
    matrix << 1, 2, 3, 4, 5, 6;
    std::cout << matrix << std::endl;
    std::cout << "after resize: " << std::endl;
    // matrix.resize(3,7); // resize 之后会调用析构函数,原先的值会变为0
    matrix.conservativeResize(3,7);
    std::cout << matrix << std::endl;
    matrix.resize(3,7);
    std::cout << "不改变大小的 resize() " << std::endl;
    std::cout << matrix << std::endl;
    /*
    输出结果为:
    1 2 3
    4 5 6
    after resize: 
    1 2 3 0 0 0 0
    4 5 6 0 0 0 0
    0 0 0 0 0 0 0
    不改变大小的 resize() 
    1 2 3 0 0 0 0
    4 5 6 0 0 0 0
    0 0 0 0 0 0 0

    如果matrix的实际大小不改变,resize函数不做任何操作。
    resize操作会执行析构函数:元素的值会被改变,如果不想改变执行 
    conservativeResize()。
    */
    return 0;
}