15

如何将一个转换Eigen::Matrix<double,Dynamic,Dynamic>为一个Eigen::SparseMatrix<double>?我正在寻找一种更好的方法,而不是遍历密集矩阵

4

2 回答 2

27

您可以为此使用 sparseView() 方法:

sparse = dense.sparseView();

甚至指定一个公差:

sparse = dense.sparseView(epsilon,reference);

于 2012-10-24T06:11:51.123 回答
1

你控制密集矩阵的创建吗?

如果你不这样做,那么如果不读取每个矩阵元素以查看它是否为空,就无法做到这一点。

如果您自己创建密集矩阵,您可以创建一个数据结构来帮助您在需要时将其转换为稀疏矩阵。例如,您可以在每个矩阵行中存储该行中非空元素的数量。然后,您可以跳过包含 0 个非空元素的行,一旦您看到计数告诉您的非空元素数量,您就可以停止任何行的转换。

您存储的额外数据取决于您期望的稀疏矩阵类型。一种常见的稀疏矩阵模式是在稀疏矩阵中浮动的密集子矩阵。当您创建密集矩阵时,您可以对那些密集区域进行标注。例如,不存储每行的元素计数,而是在某些 x,y 偏移处保留非空矩形区域的列表。

于 2012-10-23T15:46:41.413 回答