Eigen MatrixXd在c ++中回退

Fan*_*Fox 8 c++ matrix eigen

Eigen是c ++中众所周知的矩阵库.我无法找到一个内置函数来简单地将一个项目推到矩阵的末尾.目前我知道可以这样做:

Eigen::MatrixXd matrix(10, 3);
long int count = 0;
long int topCount = 10;
for (int i = 0; i < listLength; ++i) {
    matrix(count, 0) = list.x;
    matrix(count, 1) = list.y;
    matrix(count, 2) = list.z;
    count++;
    if (count == topCount) {
        topCount *= 2;
        matrix.conservativeResize(topCount, 3);
    }
}
matrix.conservativeResize(count, 3);
Run Code Online (Sandbox Code Playgroud)

这将工作(一些语法可能会出来).但它很容易做一件简单的事.是否已有内置功能?

Dav*_*own 14

对于特征矩阵没有这样的函数.原因是这样的功能要么非常慢,要么使用过多的内存.

对于一个push_back不会过于昂贵的功能,当它耗尽空间时,必须通过某种因素增加矩阵的容量.然而,当处理矩阵时,内存使用通常是一个问题,因此矩阵的容量大于必要的可能是有问题的.如果它改为大小rows()cols()每次操作都会增加大小O(n*m).这样做可以填充整个矩阵O(n*n*m*m),即使是中等大小的矩阵也会很慢.

另外,在线性代数矩阵中,矢量大小几乎总是恒定的并且事先已知.通常在调整矩阵大小时,您不关心矩阵中的先前值.这就是为什么Eigen的resize功能不会保留旧的值,不像std::vector's resize.

我能想到的唯一一个事先就是你不知道矩阵大小的情况是从文件中读取.在这种情况下,我要么首先将数据加载到标准容器中(例如std::vector使用)push_back,然后将其复制到已经大小的矩阵中,或者如果内存紧张则运行文件一次以获取大小,然后第二次复制值.


Yuu*_*shi 9

没有这样的功能,但是,你可以自己构建这样的东西:

using Eigen::MatrixXd;
using Eigen::Vector3d;

template <typename DynamicEigenMatrix>
void push_back(DynamicEigenMatrix& m, Vector3d&& values, std::size_t row)
{
    if(row >= m.rows()) {
        m.conservativeResize(row + 1, Eigen::NoChange);
    }
    m.row(row) = values;
}


int main()
{
    MatrixXd matrix(10, 3);
    for (std::size_t i = 0; i < 10; ++i) {
       push_back(matrix, Vector3d(1,2,3), i);
    }
    std::cout << matrix << "\n";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果这需要执行太多的调整,那么它将会非常缓慢.