Участник:Janyell/Хранение ненулевых элементов разреженной матрицы. Умножение разреженной матрицы на вектор: различия между версиями
Janyell (обсуждение | вклад) Новая страница: «'''Авторы страницы:''' Сычева Е.А и Хахалин А.С. = Свойства и структура алгоритмов = == Общее…» |
Janyell (обсуждение | вклад) Нет описания правки |
||
| Строка 6: | Строка 6: | ||
'''Разреженная матрица''' — матрица с большим количеством нулевых элементов. | '''Разреженная матрица''' — матрица с большим количеством нулевых элементов. | ||
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разреженной. Матрицу порядка <math>n</math> называют разреженной, если число ее ненулевых элементов <ref>С.Писсанецки. Технология разреженных матриц. - М.: Мир, 1988</ref>: | Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разреженной. Матрицу порядка <math>n</math> называют ''разреженной'', если число ее ненулевых элементов <ref>С.Писсанецки. Технология разреженных матриц. - М.: Мир, 1988</ref>: | ||
* есть <math>O(n)</math>. Приведенное определение полезно только для теоретических целей типа попытки оценить асимптотическое поведение алгоритма. | * есть <math>O(n)</math>. Приведенное определение полезно только для теоретических целей типа попытки оценить асимптотическое поведение алгоритма. | ||
| Строка 21: | Строка 21: | ||
Однако многие схемы хранения допускают определенную долю нулей, и алгоритм обрабатывает их, как если бы они не были нулями. Алгоритм, хранящий и обрабатывающий меньшее число нулей, более сложен, труднее программируется и целесообразен только для достаточно больших матриц. | Однако многие схемы хранения допускают определенную долю нулей, и алгоритм обрабатывает их, как если бы они не были нулями. Алгоритм, хранящий и обрабатывающий меньшее число нулей, более сложен, труднее программируется и целесообразен только для достаточно больших матриц. | ||
==== Диагональная схема хранения ленточных матриц ==== | |||
С ленточными матрицами связана простейшая и наиболее широко применяемая стратегия использования нулевых элементов матрицы. Матрицу <math>A</math> называют ''ленточной'', если все ее ненулевые элементы заключены внутри ленты, образованной диагоналями, параллельными главной диагонали. Таким образом, <math>a_{ij} = 0</math>, если <math>|i - j| > b</math>, и <math>a_{k, k-b} \ne 0</math>, либо <math>a_{k, k+b} \ne 0</math> хотя бы для одного значения <math>k</math>. Здесь <math>b</math> — ''полуширина'', а <math>2b + 1</math> — ''ширина ленты''. ''Лентой'' матрицы <math>A</math> называется множество элементов, для которых <math>|i - j| \leq b</math>. Другими словами, для всякой строки <math>i</math> ленте принадлежат все элементы со столбцовыми индексами от <math>i - b</math> до <math>i + b</math>, т. е. <math>2b + 1</math> элементов. | |||
Если матрица симметрична, то достаточно хранить ее ''полуленту''. Верхняя полулента состоит из элементов, находящихся в верхней части ленты, т. е. таких, что <math>0 < j - i \leq \beta </math>; нижняя полулента состоит из элементов нижней части ленты, т. е. таких, что <math>0 < i - j \leq \beta</math>; в обоих случаях в строке <math>\beta</math> элементов. | |||
== Математическое описание алгоритма == | == Математическое описание алгоритма == | ||
Версия от 09:35, 9 октября 2016
Авторы страницы: Сычева Е.А и Хахалин А.С.
Свойства и структура алгоритмов
Общее описание алгоритма
Разреженная матрица — матрица с большим количеством нулевых элементов.
Среди специалистов нет единства в определении того, какое именно количество ненулевых элементов делает матрицу разреженной. Матрицу порядка [math]\displaystyle{ n }[/math] называют разреженной, если число ее ненулевых элементов [1]:
- есть [math]\displaystyle{ O(n) }[/math]. Приведенное определение полезно только для теоретических целей типа попытки оценить асимптотическое поведение алгоритма.
- ограничено в строке, в типичном случае от 2 до 10.
- выражается как [math]\displaystyle{ n^{1+\gamma} }[/math], где [math]\displaystyle{ \gamma \lt 1 }[/math].
- таково, что для данной матрицы, данного алгоритма и данной вычислительной машины имеет смысл извлекать выгоду из наличия в ней многих нулей.
Всякую разреженную матрицу можно обрабатывать так, как если бы она была плотной: напротив, всякую плотную, или заполненную, матрицу можно обрабатывать алгоритмами для разреженных матриц. В обоих случаях получатся правильные численные результаты, но вычислительные затраты возрастут. Приписывание матрице свойства разреженности эквивалентно утверждению о существовании алгоритма, использующего ее разреженность и делающего вычисления с ней дешевле по сравнению со стандартными алгоритмами.
Три основных идеи, которые направляли развитие большей части технологии разреженных матриц:
- хранить только ненулевые элементы. Разреженная матрица, будучи множеством чисел, не имеющим регулярности, не может быть представлена в памяти машины тем же простым способом, что и полная матрица. Поэтому возникает необходимость дополнительно хранить индексную информацию, указывающую расположение каждого элемента в регулярном массиве.
- оперировать только с ненулевыми элементами. Число операций, производимых машиной при исполнении алгоритма, пропорционально числу ненулевых элементов, а не числу всех элементов матрицы.
- сохранять разреженность. Хороший алгоритм для разреженных матриц пытается сохранить разреженность, по возможности уменьшая заполнение.
Однако многие схемы хранения допускают определенную долю нулей, и алгоритм обрабатывает их, как если бы они не были нулями. Алгоритм, хранящий и обрабатывающий меньшее число нулей, более сложен, труднее программируется и целесообразен только для достаточно больших матриц.
Диагональная схема хранения ленточных матриц
С ленточными матрицами связана простейшая и наиболее широко применяемая стратегия использования нулевых элементов матрицы. Матрицу [math]\displaystyle{ A }[/math] называют ленточной, если все ее ненулевые элементы заключены внутри ленты, образованной диагоналями, параллельными главной диагонали. Таким образом, [math]\displaystyle{ a_{ij} = 0 }[/math], если [math]\displaystyle{ |i - j| \gt b }[/math], и [math]\displaystyle{ a_{k, k-b} \ne 0 }[/math], либо [math]\displaystyle{ a_{k, k+b} \ne 0 }[/math] хотя бы для одного значения [math]\displaystyle{ k }[/math]. Здесь [math]\displaystyle{ b }[/math] — полуширина, а [math]\displaystyle{ 2b + 1 }[/math] — ширина ленты. Лентой матрицы [math]\displaystyle{ A }[/math] называется множество элементов, для которых [math]\displaystyle{ |i - j| \leq b }[/math]. Другими словами, для всякой строки [math]\displaystyle{ i }[/math] ленте принадлежат все элементы со столбцовыми индексами от [math]\displaystyle{ i - b }[/math] до [math]\displaystyle{ i + b }[/math], т. е. [math]\displaystyle{ 2b + 1 }[/math] элементов.
Если матрица симметрична, то достаточно хранить ее полуленту. Верхняя полулента состоит из элементов, находящихся в верхней части ленты, т. е. таких, что [math]\displaystyle{ 0 \lt j - i \leq \beta }[/math]; нижняя полулента состоит из элементов нижней части ленты, т. е. таких, что [math]\displaystyle{ 0 \lt i - j \leq \beta }[/math]; в обоих случаях в строке [math]\displaystyle{ \beta }[/math] элементов.
Математическое описание алгоритма
Вычислительное ядро алгоритма
Макроструктура алгоритма
Схема реализации последовательного алгоритма
Последовательная сложность алгоритма
Информационный граф
Ресурс параллелизма алгоритма
Входные и выходные данные алгоритма
Свойства алгоритма
Программная реализация алгоритма
Особенности реализации последовательного алгоритма
Локальность данных и вычислений
Возможные способы и особенности параллельной реализации алгоритма
Масштабируемость алгоритма и его реализации
Динамические характеристики и эффективность реализации алгоритма
Выводы для классов архитектур
Существующие реализации алгоритма
Для вычислений с разреженными матрицами создано несколько библиотек:
- SparseLib++ (C++)
- uBLAS (C++, в составе Boost)
- SPARSPAK (Fortran)
- CSparse (C)
и другие.
Литература
<references \>
- ↑ С.Писсанецки. Технология разреженных матриц. - М.: Мир, 1988