Я пытаюсь разработать программу на C для преобразования файла разреженной матрицы в плотную матрицу. Из того, что я прочитал, лучшим подходом было бы использование связанных списков, но у меня нет опыта работы с ними, и я не нашел хорошего онлайн-ресурса, объясняющего эту тему. Я не ищу быстрого решения, а скорее веб-сайт или текстовый источник, который может объяснить, как работает процесс, чтобы я мог применить его к этому проекту. Какие ресурсы я видел, предлагают использовать три массива для обработки значений в матрице (строка, столбец и отдельное значение) и два массива для вектора (один для строки, другой для столбца). Спасибо!
Преобразование разреженной матрицы в C
Ответы (2)
Указанный формат файла предназначен для плотной матрицы. Матрица 10x10 из 100 элементов плотная. Разреженная матрица имеет менее n*m элементов, и предполагается, что все «отсутствующие» элементы равны 0. Смысл такого подхода в том, что матрицы, которые почти полностью равны нулю (что происходит во многих приложениях), будут использовать меньше Космос. Но использование формата разреженной матрицы для хранения плотной матрицы потребует гораздо больше места, чем простой массив.
Один распространенный формат файла разреженной матрицы называется MatrixMarket, и он очень похож на то, что вы описали. Первая строка имеет три значения: # строк, # столбцов, # ненулевых элементов (называемых nnz
). Тогда у вас есть nnz строк фактических элементов в триплете: (row #) (column #) (value)
Если ваша разреженная матрица имеет аналогичный формат, вам не нужна разреженная матрица в памяти. Просто отсканируйте значения и заполните свой плотный массив напрямую.
Если вы хотите иметь в памяти разреженную матрицу, есть несколько вариантов ее хранения. Триплеты проще всего, и это просто версия файла MatrixMarket в памяти. 3 массива или 1 массив структур. Наиболее распространенной структурой для операций линейной алгебры являются сжатые разреженные столбцы (CSC) или сжатые разреженные строки (CSR). Я позволю вам посмотреть это, но если вы хотите поиграть с реализацией C, вам следует взглянуть на CSparse. Точно так же MatLAB хранит разреженные матрицы, Тим был одним из тех, кто написал эту часть MatLAB.
Похоже, что связанный список может быть не тем, что вы ищете, но этот сайт предлагает довольно всеобъемлющий учебник по этому вопросу. Это может помочь пролить свет на то, подходит ли это для вашей проблемы... Удачи!