Eigen 将密集矩阵转换为稀疏矩阵

问题描述 投票:0回答:2

如何将

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

c++ matrix sparse-matrix eigen
2个回答
32
投票

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

sparse = dense.sparseView();

甚至指定公差:

sparse = dense.sparseView(reference,epsilon);


1
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.