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