Как конвертировать Eigen::Matrix<double,Dynamic,Dynamic>
для Eigen::SparseMatrix<double>
?
Я ищу лучший способ вместо итерации по плотной матрице
Вы можете использовать метод sparseView () для этого:
sparse = dense.sparseView();
и даже указать допуск:
sparse = dense.sparseView(epsilon,reference);
Вы контролируете создание плотной матрицы?
Если вы этого не сделаете, то нет способа сделать это без чтения каждого элемента матрицы, чтобы увидеть, если он пуст.
Если вы создаете плотную матрицу самостоятельно, вы можете создать структуру данных, чтобы помочь преобразовать ее в разреженную, когда вам это необходимо. Например, вы можете хранить с каждой строкой матрицы количество ненулевых элементов в этой строке. Затем вы можете пропустить строки с 0 ненулевыми элементами и остановить преобразование любой строки, когда увидите столько ненулевых элементов, сколько подсчитывает количество.
Какие дополнительные данные вы храните, будет зависеть от ожидаемых типов разреженных матриц. Распространенным шаблоном разреженной матрицы являются плотные подматрицы, плавающие в разреженной матрице. Вы можете не указывать эти плотные области при создании плотной матрицы. Например. не сохраняйте количество элементов в строке, а храните список ненулевых прямоугольных областей с определенными смещениями x, y.