Уровень алгоритма

Участник:Lexaloris/Умножение разреженной матрицы на вектор: различия между версиями

Материал из Алговики
Перейти к навигации Перейти к поиску
Нет описания правки
Строка 17: Строка 17:
=== Хранение ненулевых элементов разреженной матрицы ===
=== Хранение ненулевых элементов разреженной матрицы ===


Одной из наиболее ши­роко используемых схем хранения разреженных матриц является разреженный строчный формат. Эта
==== Разреженный строчной формат ====
 
Одной из наиболее ши­роко используемых схем хранения разреженных матриц является ''разреженный строчный формат''. Эта
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.
схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор.
Например, рассмотрим формат хранения разряженной матрицы <math>A</math>:
Например, рассмотрим формат хранения разряженной матрицы <math>A</math>:
Строка 23: Строка 25:
[[File:RRCOMatrix.png]]
[[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>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> представляется в виде:
Таким образом <math>A</math> представляется в виде:
 
IA = 1 4 4 6
JA = 3 4 8 6 8
AN = 1 3 5 7 1


Данный способ представления называют полным, поскольку представлена вся матрица А, и упорядоченным, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно RR (С) О.
  IA = [ 1 4 4 6 ]
  JA = [ 3 4 8 6 8 ]
  AN = [ 1 3 5 7 1 ]
 
Данный способ представления называют ''полным'', поскольку представлена вся матрица <math>A</math>, и ''упорядоченным'', поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно '''(RR (С) О)'''.
 
==== Неупорядоченное представление ====
 
Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но ''неупорядоченное'' '''(RR (С) U )'''.
 
Неупорядоченное представление <math>A</math>:
 
  IA = [ 1 4 4 6 ]
  JA = [ 8 3 4 8 6 ]
  AN = [ 5 1 3 1 7 ]
 
Неупорядоченные представления могут быть очень удобны. Результаты большинства матричных операций получаются не­ упорядоченными, и упорядочение их стоило бы больших затрат машинного времени. В то же время, за немногими исключениями, алгоритмы для разреженных матриц не требуют, чтобы представления были упорядоченными.
 
=== Умножение разреженной матрицы на вектор ===


Пусть <math>N</math> — число строк матрицы.  
Пусть <math>N</math> — число строк матрицы.  
Для каждой ее строки <math>I</math> матрийы мы находим с помощью <math>IA</math> значения первой <math>IAA</math> и последней <math>IAB</math> позиций, занимаемых элементами строки <math>I</math> в массивах <math>JA</math> и <math>AN</math>. Затем, чтобы вычислить скалярное произведение строки <math>I</math> и вектора <math>B</math>, мы просто просматриваем <math>JA</math> и <math>AN</math> на отрезке от <math>IAA</math> до <math>IAB</math>:
Для каждой ее строки <math>I</math> матрицы мы находим с помощью <math>IA</math> значения первой <math>IAA</math> и последней <math>IAB</math> позиций, занимаемых элементами строки <math>I</math> в массивах <math>JA</math> и <math>AN</math>. Затем, чтобы вычислить скалярное произведение строки <math>I</math> и вектора <math>B</math>, мы просто просматриваем <math>JA</math> и <math>AN</math> на отрезке от <math>IAA</math> до <math>IAB</math>:
каждое значение, хранимое в <math>JA</math>, есть столбцовый индекс и используется для извлечения из массива <math>B</math> элемента, который должен быть умножен на соответствующее число из <math>AN</math>. Результат каж­дого умножения прибавляется к <math>C(I)</math>.
каждое значение, хранимое в <math>JA</math>, есть столбцовый индекс и используется для извлечения из массива <math>B</math> элемента, который должен быть умножен на соответствующее число из <math>AN</math>. Результат каж­дого умножения прибавляется к <math>C(I)</math>.


Строка 41: Строка 57:
'''Исходные данные:'''  
'''Исходные данные:'''  


<math>IA, JA, AN</math> - заданная матрица в форме RR (С) U;
<math>IA, JA, AN</math> - заданная матрица в форме '''(RR (С) U)''';


<math>B</math> - заданный заполненный вектор;
<math>B</math> - заданный заполненный вектор;

Версия от 13:48, 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 ]

Данный способ представления называют полным, поскольку представлена вся матрица [math]\displaystyle{ A }[/math], и упорядоченным, поскольку эле­менты каждой строки хранятся в соответствии с возрастанием столбцовых индексов. Таким образом, это строчное представление, полное и упорядоченное, или сокращенно (RR (С) О).

Неупорядоченное представление

Представления разреженных матриц необязательно должны быть упорядочены в том смысле, что, хотя упорядоченность строк поддерживается, внутри каждой строки элементы могут храниться в произвольном порядке. Для матрицы А нашего примера вполне можно было бы использовать и строчное представление, полное, но неупорядоченное (RR (С) U ).

Неупорядоченное представление [math]\displaystyle{ A }[/math]:

  IA = [ 1 4 4 6 ]
  JA = [ 8 3 4 8 6 ]
  AN = [ 5 1 3 1 7 ]

Неупорядоченные представления могут быть очень удобны. Результаты большинства матричных операций получаются не­ упорядоченными, и упорядочение их стоило бы больших затрат машинного времени. В то же время, за немногими исключениями, алгоритмы для разреженных матриц не требуют, чтобы представления были упорядоченными.

Умножение разреженной матрицы на вектор

Пусть [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. Информационный граф алгоритма.

Ресурс параллелизма алгоритма

Входные и выходные данные алгоритма

Свойства алгоритма

Алгоритм в рамках выбранной версии полностью детерминирован.

Вычислительная мощность алгоритма, как отношение числа операций к суммарному объему входных и выходных данных – константа.

Программная реализация алгоритма

Масштабируемость алгоритма и его реализации

Существующие реализации алгоритма

Литература

[1] С. Писсанецки. Технология разреженных матриц. Изд. Мир, 1988.