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

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

Материал из Алговики
Перейти к навигации Перейти к поиску
Строка 111: Строка 111:
 
Псевдокод алгоритма:  
 
Псевдокод алгоритма:  
  
     FOR I = 1, N
+
     FOR I = 1, N                         (1)
        U = 0.
+
      U = 0.                             (2)
       IAA = IA(I)
+
       IAA = IA(I)                        (3)  
       IAB = IA(I + 1 ) - 1
+
       IAB = IA(I + 1 ) - 1               (4)
       IF NOT(IAB.LT.IAA)
+
       IF NOT(IAB.LT.IAA)                (5)
           FOR J = IAA, IAB
+
           FOR J = IAA, IAB               (6)
           C(I) = U + AN(J)*B(JA(J))
+
           C(I) = U + AN(J)*B(JA(J))      (7)
  
 
== Последовательная сложность алгоритма ==
 
== Последовательная сложность алгоритма ==

Версия 17:23, 15 октября 2016


Умножение разреженной матрицы на вектор
Последовательный алгоритм
Последовательная сложность [math]O(k)[/math]
Объём входных данных [math]k + m[/math]
Объём выходных данных [math]n[/math]
Параллельный алгоритм
Высота ярусно-параллельной формы [math]O(m)[/math]
Ширина ярусно-параллельной формы [math]O(n)[/math]


Авторы страницы: A.Д. Новоселов и П.А. Кочетков

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

1.1 Общее описание алгоритма

1.1.1 Хранение ненулевых элементов разреженной матрицы

1.1.1.1 Разреженный строчной формат

Одной из наиболее ши­роко используемых схем хранения разреженных матриц является разреженный строчный формат. Эта схема предъявляет минимальные требования к памяти и в то же время оказывается очень удобной для умножения разреженной матрицы на вектор. Например, рассмотрим формат хранения разряженной матрицы [math]A[/math]:

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 ]

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

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

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

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

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

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

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

Пусть [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]JA[/math], есть столбцовый индекс и используется для извлечения из массива [math]B[/math] элемента, который должен быть умножен на соответствующее число из [math]AN[/math]. Результат каж­дого умножения прибавляется к [math]C(I)[/math].

1.2 Математическое описание алгоритма

Исходные данные:

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

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

[math]N[/math] - число строк матрицы.

Выход: [math]C[/math] вектор-произведение размерности [math]N[/math].

Формулы метода:

[math] \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]

1.3 Вычислительное ядро алгоритма

Вычислительным ядром, т.е. той частью алгоритма, на которую приходится основное время его работы, является вычисление значения [math]i[/math]-го элемента [math]c_{i}[/math] вектора-произведения, т.е произведения строки [math]I[/math] матрицы [math]A[/math] и вектора [math]B[/math] по формуле:

[math] \begin{align} & c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\ \end{align} [/math]

1.4 Макроструктура алгоритма

Основу алгоритма составляет вычисление значения [math]i[/math]-го элемента [math]c_{i}[/math] вектора-произведения:

[math] \begin{align} & c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j)), \quad i \in [1, N] \\ \end{align} [/math]

1.5 Схема реализации последовательного алгоритма

Последовательность исполнения метода следующая:

Далее для всех [math]i[/math] от [math]1[/math] до [math]N[/math] по нарастанию выполняются:

1. [math] c_{i} = 0; IAA = IA(i); IAB = IA(i + 1 ) - 1 [/math]

После этого, если [math](IAB \le IAA)[/math]:

2. Для всех [math]j[/math] от [math]IAA[/math] до [math]IAB[/math] выполняется:

[math]c_{i} = \sum\limits_{j = IAA_{i}}^{IAB_{i}} AN(j)B(JA(j))[/math]

Псевдокод алгоритма:

   FOR I = 1, N                          (1)
      U = 0.                             (2) 
      IAA = IA(I)                        (3) 
      IAB = IA(I + 1 ) - 1               (4)
      IF NOT(IAB.LT.IAA)                 (5)
          FOR J = IAA, IAB               (6)
          C(I) = U + AN(J)*B(JA(J))      (7)

1.6 Последовательная сложность алгоритма

Для всего алгоритма потребуется выполнить [math]O(M)[/math] операций, где [math]M[/math] - число ненулевых эле­ментов матрицы.

1.7 Информационный граф

Рисунок 1. Информационный граф алгоритма.

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

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

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

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

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

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

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

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

3 Литература

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