如何将Eigen::Matrix<double,Dynamic,Dynamic>
转换为Eigen::SparseMatrix<double>
?
我正在寻找一种更好的方法,而不是遍历密集矩阵
答案 0 :(得分:18)
你可以使用sparseView()方法:
sparse = dense.sparseView();
甚至指定容差:
sparse = dense.sparseView(epsilon,reference);
答案 1 :(得分:1)
您是否控制密集矩阵的创建?
如果不这样做,那么在没有读取每个矩阵元素的情况下都无法做到这一点,看它是否为空。
如果你自己创建密集矩阵,你可以创建一个数据结构,以便在需要时将其转换为稀疏。例如,您可以使用每个矩阵行存储该行中非空元素的数量。然后你可以跳过包含0个非null元素的行,并且一旦你看到计数告诉你的非空元素,就可以停止任何行的转换。
您存储的额外数据取决于您期望的稀疏矩阵的类型。常见的稀疏矩阵模式是在稀疏矩阵中浮动的密集子矩阵。在创建密集矩阵时,可以使这些密集区域无效。例如。不要存储每行的元素数,而是在某些x,y偏移处保留一个非空矩形区域列表。