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);
这将有效(一些语法可能会出来)。但它很容易做一件简单的事。是否已有内置功能?
答案 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;
}
如果这需要执行太多的调整,那么它将会非常缓慢。