特征将密集矩阵转换为稀疏矩阵

时间:2012-10-23 15:14:51

标签: c++ matrix sparse-matrix eigen

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

2 个答案:

答案 0 :(得分:18)

你可以使用sparseView()方法:

sparse = dense.sparseView();

甚至指定容差:

sparse = dense.sparseView(epsilon,reference);

答案 1 :(得分:1)

您是否控制密集矩阵的创建?

如果不这样做,那么在没有读取每个矩阵元素的情况下都无法做到这一点,看它是否为空。

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

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