通过conservativeResize维护ColXpr到MatrixXf

时间:2015-07-16 14:27:22

标签: c++ eigen eigen3

我正在尝试维护一个变量,该变量引用了保守调整大小的Eigen :: MatrixXf的第一列。

ColXpr c调整大小并且无法重新分配时,MatrixXf m看起来无效。我可以看到这可以如何保护我免受错误,但我不明白我应该做什么,以便c为我提供新m的第一列?

#include <iostream>
#include <Eigen/Dense>

int main()
{
    Eigen::MatrixXf m = Eigen::MatrixXf::Random(4,2);
    Eigen::MatrixXf::ColXpr c = m.col(0);

    std::cout << m << std::endl;
    //   0.680375  0.823295
    //  -0.211234 -0.604897
    //   0.566198 -0.329554
    //    0.59688  0.536459
    std::cout << c << std::endl;
    //   0.680375
    //  -0.211234
    //   0.566198
    //    0.59688

    m.conservativeResize(3, Eigen::NoChange);

    std::cout << m << std::endl;
    //   0.680375  0.823295
    //  -0.211234 -0.604897
    //   0.566198 -0.329554
    std::cout << c << std::endl;
    //  1.4013e-45
    //           0
    //  1.4013e-45
    //           0


    c = m.col(0); // <<<<< This cores with the Eigen Warning
    // Assertion `rows() == other.rows() && cols() == other.cols()' failed.

    std::cout << c << std::endl;
    return EXIT_SUCCESS;
} 

1 个答案:

答案 0 :(得分:1)

ColXpr这样的特征表达式类型旨在用作临时数据,在一行中构造和销毁。它们的主要目的是避免不必要的复制 - 在ColXpr情况下,通过别名来自原始数组的数据。

别名是一个实现细节,而不是面向用户的功能。即使您只是修改原始矩阵,也不应该依赖ColXpr更新,更不用说调整它了。

如果你想要的东西会一直给你矩阵的第一列,那就是m.col(0)。如果你愿意,你可以将它包装在一个函数中。