Содержит ли Eigen пример "формата разреженной матрицы" ошибку? - PullRequest
0 голосов
/ 22 июня 2019

Eigen 3.3.7 документация для SparceMatrix http://eigen.tuxfamily.org/dox/group__TutorialSparse.html Кажется, содержит ошибку в формате разреженной матрицы раздел:

This storage scheme is better explained on an example. The following matrix

0   3   0   0   0
22  0   0   0   17
7   5   0   1   0
0   0   0   0   0
0   0   14  0   8

and one of its possible sparse, column major representation:

Values:         22  7   _   3   5   14  _   _   1   _   17  8
InnerIndices:   1   2   _   0   2   4   _   _   2   _   1   4
OuterStarts:    0   3   5   8   10  12
InnerNNZs:      2   2   1   1   2   

Если 14 переместится из третьего столбца во второй (т.е. его индексы изменились с [4,2] на [4,1]), то первые два массива, Values и InnerIndices, сделают смысл. OuterStarts не представляется правильным для позиции 14, в то время как InnerNNZs имеет смысл для 14 в элементе [4,2] матрицы, но несовместимо с массивом Values.

Этот пример неверен или я что-то упустил?

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

1 Ответ

1 голос
/ 23 июня 2019

Ключ заключается в том, что пользователь должен зарезервировать как минимум столько записей в столбце, сколько ему нужно. В этом примере пользователь зарезервировал только 2 записи для второго столбца, поэтому, если бы вы попытались добавить еще одну запись в этот столбец, это, вероятно, потребовало бы дорогостоящего перераспределения или, по крайней мере, сложного перехода, чтобы «украсть» неиспользуемую запись из другой столбец. (Понятия не имею, как это реализовано.)

После беглого просмотра документации, на которую вы ссылались, я не увидел ничего о перемещении записей, как вы пытаетесь сделать. Я не уверен, что Эйген поддерживает такую ​​операцию. (Поправьте меня, если я ошибаюсь.) Я также не уверен, почему вы захотите это сделать.

Ваш последний вопрос, вероятно, слишком широкий. Я не эксперт в Eigen, но это похоже на зрелую, мощную и хорошо документированную библиотеку. Если у вас есть какие-то конкретные проблемы при составлении примеров, вы должны опубликовать их здесь или на форуме, посвященном Eigen. Многие в scicomp.SE хорошо разбираются в Eigen и любезны.

...