2016-07-20 3 views
2

Какой самый быстрый способ редактировать диагональ разреженной матрицы в Eigen? Я уже заполнил его с помощью триплетов, но иногда мне нужно изменить все диагональные значения (они уже были установлены на ненулевое значение).Eigen - диагональное обновление разреженной матрицы

ответ

2

Если приемлемо, вы могли бы просто использовать их индексы, как

sp_mat(i, i) 

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

  1. Вы не меняете основной макет матрицы, например. добавление/удаление nnzs, сжатие;
  2. Вы будете обращаться к диагонали повторно.

С этими ограничениями вы можете хранить указатели диагональных компонентов, чтобы вы могли получить доступ к данным позже в O (1) раз. Вы можете получить указатель с

&sp_mat(i, i) 
+0

Право, это точно мои условия. Знать, как получить доступ к указателям на эти позиции? – cgreen

+0

@cgreen use '&' – kangshiyin

2

Для завершения kangshiyin ответа, вы можете также редактировать диагонали через плотные векторные выражения, например, чтобы добавить 1 к каждому диагональному элементу:

sp_mat.diagonal().array() += 1; 

Предупреждения: это будет работать только в том случае, если диагональные элементы уже существуют, что имеет место в исходном вопросе.

+0

Правильно, для меня элементы уже будут существовать. Вы ожидали бы, что выражение будет быстрее/медленнее, чем сохранение указателей и изменение напрямую? – cgreen

+0

Таким образом, этот подход будет по-прежнему включать двоичные запросы каждый раз, но в некоторых случаях их легче писать. – ggael

+0

Есть .diagonal() в v3.2.9? – kangshiyin

Смежные вопросы