Участник:Lexaloris/Умножение разреженной матрицы на вектор: различия между версиями
Lexaloris (обсуждение | вклад) |
Lexaloris (обсуждение | вклад) |
||
| Строка 19: | Строка 19: | ||
Одной из наиболее широко используемых схем хранения разреженных матриц является разреженный строчный формат. Эта | Одной из наиболее широко используемых схем хранения разреженных матриц является разреженный строчный формат. Эта | ||
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор. | схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор. | ||
Например, рассмотрим формат хранения разряженной матрицы <math>A</math>: | |||
[[ | [[File:RRCOMatrix.png]] | ||
Значения ненулевых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах; назовем их соответственно <math>AN</math> и <math>JA</math>. Используется также массив указателей <math>IA</math>, отмечающих позиции массивов <math>AN</math> и <math>JA</math>, с которых начинается описание очередной строки. Дополнительная компонента в <math>IA</math> содержит указатель первой свободной позиции в <math>JA</math> и <math>AN</math>. | |||
Таким образом <math>A</math> представляется в виде: | |||
IA = 1 4 4 6 | |||
JA = 3 4 8 6 8 | |||
AN = 1 3 5 7 1 | |||
Данный способ представления называют полным, поскольку представлена вся матрица А, и упорядоченным, поскольку элементы каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно RR (С) О. | |||
Пусть <math>N</math> — число строк матрицы. | Пусть <math>N</math> — число строк матрицы. | ||
Версия от 13:19, 15 октября 2016
| Умножение разреженной матрицы на вектор | |
| Последовательный алгоритм | |
| Последовательная сложность | [math]\displaystyle{ O(k) }[/math] |
| Объём входных данных | [math]\displaystyle{ k + m }[/math] |
| Объём выходных данных | [math]\displaystyle{ n }[/math] |
| Параллельный алгоритм | |
| Высота ярусно-параллельной формы | [math]\displaystyle{ O(m) }[/math] |
| Ширина ярусно-параллельной формы | [math]\displaystyle{ O(n) }[/math] |
Авторы страницы: A.Д. Новоселов и П.А. Кочетков
Свойства и структура алгоритмов
Общее описание алгоритма
Хранение ненулевых элементов разреженной матрицы
Одной из наиболее широко используемых схем хранения разреженных матриц является разреженный строчный формат. Эта схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор. Например, рассмотрим формат хранения разряженной матрицы [math]\displaystyle{ A }[/math]:
Значения ненулевых элементов матрицы и соответствующие столбцовые индексы хранятся в этой схеме по строкам в двух массивах; назовем их соответственно [math]\displaystyle{ AN }[/math] и [math]\displaystyle{ JA }[/math]. Используется также массив указателей [math]\displaystyle{ IA }[/math], отмечающих позиции массивов [math]\displaystyle{ AN }[/math] и [math]\displaystyle{ JA }[/math], с которых начинается описание очередной строки. Дополнительная компонента в [math]\displaystyle{ IA }[/math] содержит указатель первой свободной позиции в [math]\displaystyle{ JA }[/math] и [math]\displaystyle{ AN }[/math].
Таким образом [math]\displaystyle{ A }[/math] представляется в виде:
IA = 1 4 4 6 JA = 3 4 8 6 8 AN = 1 3 5 7 1
Данный способ представления называют полным, поскольку представлена вся матрица А, и упорядоченным, поскольку элементы каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно RR (С) О.
Пусть [math]\displaystyle{ N }[/math] — число строк матрицы. Для каждой ее строки [math]\displaystyle{ I }[/math] матрийы мы находим с помощью [math]\displaystyle{ IA }[/math] значения первой [math]\displaystyle{ IAA }[/math] и последней [math]\displaystyle{ IAB }[/math] позиций, занимаемых элементами строки [math]\displaystyle{ I }[/math] в массивах [math]\displaystyle{ JA }[/math] и [math]\displaystyle{ AN }[/math]. Затем, чтобы вычислить скалярное произведение строки [math]\displaystyle{ I }[/math] и вектора [math]\displaystyle{ B }[/math], мы просто просматриваем [math]\displaystyle{ JA }[/math] и [math]\displaystyle{ AN }[/math] на отрезке от [math]\displaystyle{ IAA }[/math] до [math]\displaystyle{ IAB }[/math]: каждое значение, хранимое в [math]\displaystyle{ JA }[/math], есть столбцовый индекс и используется для извлечения из массива [math]\displaystyle{ B }[/math] элемента, который должен быть умножен на соответствующее число из [math]\displaystyle{ AN }[/math]. Результат каждого умножения прибавляется к [math]\displaystyle{ C(I) }[/math].
Математическое описание алгоритма
Исходные данные:
[math]\displaystyle{ IA, JA, AN }[/math] - заданная матрица в форме RR (С) U;
[math]\displaystyle{ B }[/math] - заданный заполненный вектор;
[math]\displaystyle{ N }[/math] - число строк матрицы.
Выход: [math]\displaystyle{ C }[/math] вектор-произведение размерности [math]\displaystyle{ N }[/math].
Формулы метода:
- [math]\displaystyle{ \begin{align} & IAA_{i} = IA(i), \quad i \in [1, N], \\ & IAB_{i} = IA(i + 1) - 1, \quad i \in [1, N], \\ & c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\ \end{align} }[/math]
Вычислительное ядро алгоритма
Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения [math]\displaystyle{ i }[/math]-го элемента [math]\displaystyle{ c_{i} }[/math] вектора-произведения, т.е произведения строки [math]\displaystyle{ I }[/math] матрицы [math]\displaystyle{ A }[/math] и вектора [math]\displaystyle{ B }[/math] по формуле:
- [math]\displaystyle{ \begin{align} & c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\ \end{align} }[/math]
Макроструктура алгоритма
Схема реализации последовательного алгоритма
Последовательность исполнения метода следующая:
Далее для всех [math]\displaystyle{ i }[/math] от [math]\displaystyle{ 1 }[/math] до [math]\displaystyle{ N }[/math] по нарастанию выполняются:
1. [math]\displaystyle{ c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 }[/math]
После этого, если [math]\displaystyle{ (IAB \lt = IAA) }[/math]:
2. Для всех [math]\displaystyle{ j }[/math] от [math]\displaystyle{ IAA }[/math] до [math]\displaystyle{ IAB }[/math] выполняется:
[math]\displaystyle{ c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)) }[/math]
Последовательная сложность алгоритма
Для всего алгоритма потребуется выполнить [math]\displaystyle{ O(M) }[/math] операций, где [math]\displaystyle{ M }[/math] - число ненулевых элементов матрицы.
Информационный граф

Ресурс параллелизма алгоритма
Входные и выходные данные алгоритма
Свойства алгоритма
Алгоритм в рамках выбранной версии полностью детерминирован.
Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.
Программная реализация алгоритма
Масштабируемость алгоритма и его реализации
Существующие реализации алгоритма
Литература
[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.
