如何将Eigen::Matrix<double,Dynamic,Dynamic>转换为Eigen::SparseMatrix<double>?我正在寻找一种更好的方法,而不是迭代密集矩阵
Eigen::Matrix<double,Dynamic,Dynamic>
Eigen::SparseMatrix<double>
jmo0nnb31#
你可以使用sparseView()方法来实现这个目的:sparse = dense.sparseView();甚至指定公差:sparse = dense.sparseView(reference,epsilon);
sparse = dense.sparseView();
sparse = dense.sparseView(reference,epsilon);
brqmpdu12#
您是否控制密集矩阵的创建?如果你不这样做,那么就没有办法做到这一点,而不阅读每个矩阵元素,看看它是否为空。如果您自己创建密集矩阵,则可以创建一个数据结构,以便在需要时帮助将其转换为稀疏矩阵。例如,您可以存储矩阵的每一行中非空元素的数量。然后,您可以跳过包含0个非空元素的行,并且在您看到计数告诉您的非空元素数量后,可以停止任何行的转换。存储的额外数据取决于您期望的稀疏矩阵类型。常见的稀疏矩阵模式是稀疏矩阵中浮动的密集子矩阵。您可以在创建密集矩阵时表示这些密集区域。例如,不存储每行的元素计数,而是保留特定x,y偏移的非空矩形区域列表。
2条答案
按热度按时间jmo0nnb31#
你可以使用sparseView()方法来实现这个目的:
sparse = dense.sparseView();
甚至指定公差:
sparse = dense.sparseView(reference,epsilon);
brqmpdu12#
您是否控制密集矩阵的创建?
如果你不这样做,那么就没有办法做到这一点,而不阅读每个矩阵元素,看看它是否为空。
如果您自己创建密集矩阵,则可以创建一个数据结构,以便在需要时帮助将其转换为稀疏矩阵。例如,您可以存储矩阵的每一行中非空元素的数量。然后,您可以跳过包含0个非空元素的行,并且在您看到计数告诉您的非空元素数量后,可以停止任何行的转换。
存储的额外数据取决于您期望的稀疏矩阵类型。常见的稀疏矩阵模式是稀疏矩阵中浮动的密集子矩阵。您可以在创建密集矩阵时表示这些密集区域。例如,不存储每行的元素计数,而是保留特定x,y偏移的非空矩形区域列表。