для класса я должен написать свой собственный решатель линейных уравнений для разреженных матриц. Я могу использовать любой тип структуры данных для разреженных матриц, и мне нужно реализовать несколько решений, включая сопряженный градиент.
Мне было интересно, есть ли известный способ хранения разреженных матриц, при котором умножение на вектор выполняется относительно быстро.
Прямо сейчас мои разреженные матрицы в основном реализованы как завернутый std::map< std::pair<int, int>, double>
, в котором хранятся данные, если таковые имеются. Это преобразует умножение матрицы с вектором на сложность O (n²) в O (n²log (n)), поскольку мне нужно выполнить поиск для каждого элемента матрицы. Я изучил формат матрицы Yale Sparse, и кажется, что получение элемента также находится в O (log (n)), поэтому я не уверен, будет ли это намного быстрее.
Для справки у меня есть матрица 800x800, заполненная 5000 записями. Решение такой системы с помощью метода сопряженных градиентов занимает примерно 450 секунд.
Как вы думаете, можно ли сделать это намного быстрее с другой структурой данных?
Благодарность!