特征矩阵c++; 本征是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::MatrixXd矩阵(10,3); 长整数计数=0; 长整数topCount=10; 对于(int i=0;i=m.rows()){ m、 保守调整大小(行+1,特征::无更改); } m、 行(row)=值; } int main() { 矩阵x3d矩阵(10,3); 对于(标准::尺寸i=0;i

特征矩阵c++; 本征是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::MatrixXd矩阵(10,3); 长整数计数=0; 长整数topCount=10; 对于(int i=0;i=m.rows()){ m、 保守调整大小(行+1,特征::无更改); } m、 行(row)=值; } int main() { 矩阵x3d矩阵(10,3); 对于(标准::尺寸i=0;i,c++,matrix,eigen,C++,Matrix,Eigen,这样就行了(有些语法可能已经过时了)。但对于一件简单的事情来说,这是相当复杂的。已经有内置函数了吗?对于特征矩阵没有这样的函数。这样做的原因是这样一个函数要么速度很慢,要么使用过多的内存 要使push_back功能的成本不高,必须在空间耗尽时将矩阵的容量增加一个因素,就像您所做的那样。然而,在处理矩阵时,内存使用通常是一个问题,因此矩阵的容量大于必要容量可能会有问题。 如果每次操作都将大小增加rows()或cols(),则操作将是O(n*m)。这样做来填充整个矩阵将是O(n*n*m*m),即使是

这样就行了(有些语法可能已经过时了)。但对于一件简单的事情来说,这是相当复杂的。已经有内置函数了吗?

对于特征矩阵没有这样的函数。这样做的原因是这样一个函数要么速度很慢,要么使用过多的内存

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


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


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

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

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;
}
使用Eigen::MatrixXd;
使用Eigen::Vector3d;
模板
void push______________________________________
{
如果(行>=m.rows()){
m、 保守调整大小(行+1,特征::无更改);
}
m、 行(row)=值;
}
int main()
{
矩阵x3d矩阵(10,3);
对于(标准::尺寸i=0;i<10;++i){
推回(矩阵,向量3D(1,2,3),i);
}

cout::cout-Well-Eigen允许您在编译时定义MaxRows-MaxCols,因此即使您在运行时之前不知道确切的大小,内存需求仍然是有界的(调整大小/推回操作不需要内存分配)。如果您可以推回元素、行和列,只要大小