Eigen MatrixXd在c ++中回退

时间:2013-01-02 23:09:38

标签: 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);

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

2 个答案:

答案 0 :(得分:14)

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

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

此外,在线性代数矩阵中,矢量大小几乎总是恒定的并且事先已知。通常在调整矩阵大小时,您不关心矩阵中的先前值。这就是为什么Eigen的resize函数不会保留旧值,而不像std::vector的{​​{1}}。

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

答案 1 :(得分: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;
}

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