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