gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:04:41 29 4
gpt4 key购买 nike

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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com