Эйген преобразует плотную матрицу в разреженную

Как преобразовать Eigen::Matrix<double,Dynamic,Dynamic> в Eigen::SparseMatrix<double>? Я ищу лучший способ вместо того, чтобы перебирать плотную матрицу


person Alberto    schedule 23.10.2012    source источник
comment
Позвольте мне понять это. Вы хотите преобразовать плотную матрицу в разреженную, не проверяя, какие элементы являются нулями и должны быть удалены, а какие элементы вы хотите сохранить? Как вы думаете, как это может работать? Вам обязательно стоит поработать над этим вопросом - он очень неясен.   -  person angainor    schedule 24.10.2012
comment
Без проверки элементов вручную. Я ищу метод, функцию или библиотеку для этого. Но из того, что я здесь прочитал, я думаю, что это невозможно   -  person Alberto    schedule 24.10.2012


Ответы (2)


вы можете использовать для этого метод sparseView():

sparse = dense.sparseView();

и даже указать допуск:

sparse = dense.sparseView(epsilon,reference);

person ggael    schedule 24.10.2012
comment
Мне трудно ориентироваться в Eigen-ссылке и коде. Не могли бы вы добавить ссылки на документацию и/или ссылку на папку/файл, где можно найти эти функции? - person gr4nt3d; 08.08.2018
comment
Для [документации][eigen.tuxfamily.org/dox/] найдите sparseView в встроенная поисковая система (вверху справа) для исходного кода grep sparseView Eigen/ -R даст вам то, что вы ищете. - person ggael; 09.08.2018

Вы контролируете создание плотной матрицы?

Если вы этого не сделаете, то это невозможно сделать, не читая каждый элемент матрицы, чтобы увидеть, пуст ли он.

Если вы создаете плотную матрицу самостоятельно, вы можете создать структуру данных, которая поможет преобразовать ее в разреженную, когда вам это нужно. Например, вы можете хранить в каждой строке матрицы количество ненулевых элементов в этой строке. Затем вы можете пропустить строки с 0 ненулевыми элементами, и вы можете остановить преобразование любой строки, как только вы увидите столько ненулевых элементов, сколько вам подсказывает подсчет.

Какие дополнительные данные вы храните, будет зависеть от типов разреженных матриц, которые вы ожидаете. Обычный шаблон разреженной матрицы представляет собой плотные подматрицы, плавающие в разреженной матрице. Вы можете не фиксировать эти плотные области при создании плотной матрицы. Например. не храните количество элементов в строке, а храните список ненулевых прямоугольных областей с определенными смещениями x, y.

person Rafael Baptista    schedule 23.10.2012