c++ - C++ 中的 Eigen MatrixXd 推回

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

这会起作用(一些语法可能会失效)。但是对于一件简单的事情来说,它相当复杂。是否已有内置函数?

最佳答案

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

要使 push_back 函数的成本不至于过高,它必须像您所做的那样在空间用完时将矩阵的容量增加一些因素。然而,在处理矩阵时,内存使用通常是一个问题,因此矩阵的容量大于必要的容量可能会出现问题。 如果它每次都将大小增加 rows()cols(),则操作将为 O(n*m)。这样做来填充整个矩阵将是 O(n*n*m*m),即使是中等大小的矩阵也会非常慢。

此外,在线性代数中,矩阵和 vector 的大小几乎总是常数并且事先已知。通常在调整矩阵大小时,您并不关心矩阵中先前的值。这就是为什么 Eigen 的 resize 函数不保留旧值的原因,这与 std::vectorresize 不同。

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

关于c++ - C++ 中的 Eigen MatrixXd 推回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14130699/

相关文章:

c - 为什么我用 C 编写的矩阵乘法程序不起作用?

c++ - 尝试将匹配的 char 变量打印到 cout

c++ - gcc 链接器描述文件强制符号位于特定地址

c++ - 委托(delegate)构造函数和默认参数取决于其他参数

c++ - 找不到n * n矩阵的行列式

c++ - 如何与 Eigen 进行逐元素比较?

c++在子字符串的最后一个匹配之后删除子字符串

android - Matrix.setRotateM 和 Matrix.rotateM 有区别吗

c++ - 将特征向量复制到 C 数组?

eigen - 将 Armadillo 矩阵转换为特征矩阵,反之亦然