Библиотека алгоритмов: различия между версиями
[непроверенная версия] | [непроверенная версия] |
Строка 149: | Строка 149: | ||
На рисунке изображён граф алгоритма без входных и выходных данных для случая суммирования 25 элементов массива на 5 процессорах.</br> | На рисунке изображён граф алгоритма без входных и выходных данных для случая суммирования 25 элементов массива на 5 процессорах.</br> | ||
=='''Компактная схема метода Гаусса для трёхдиагональной матрицы'''== | =='''Компактная схема метода Гаусса для трёхдиагональной матрицы'''== | ||
+ | [[Файл:XYprojection4.jpg|мини|XY projection]] | ||
+ | =====Ссылка на описание в энциклопедии AlgoWiki:===== | ||
+ | [https://algowiki-project.org/ru/Компактная_схема_метода_Гаусса_для_трёхдиагональной_матрицы,_последовательный_вариант Компактная схема метода Гаусса для трёхдиагональной матрицы]</br> | ||
+ | |||
+ | =====Описание алгоритма на Algolang:===== | ||
+ | <algo></br> | ||
+ | : <params></br> | ||
+ | :: <param name="n" type="int" value="6"></param></br> | ||
+ | : </params></br></br> | ||
+ | |||
+ | : <block id="0" dims="2"></br> | ||
+ | :: <arg name="j" val="1..n"></arg> | ||
+ | :: <arg name="i" val="1..n"></arg></br></br> | ||
+ | |||
+ | :: деление | ||
+ | :: <vertex condition="(i=j+1)and(j>1)" type="1"></br> | ||
+ | ::: <in src="j,j"></in></br> | ||
+ | :: </vertex></br></br> | ||
+ | |||
+ | :: вычетание | ||
+ | :: <vertex condition="(j=i)and(j>1)" type="2"></br> | ||
+ | ::: <in src="j,i-1"></in></br> | ||
+ | :: </vertex></br></br> | ||
+ | |||
+ | :: умножение | ||
+ | :: <vertex condition="j=i+1" type="3"></br> | ||
+ | ::: <in src="j-1,i+1"></in></br> | ||
+ | :: </vertex></br> | ||
+ | : </block></br> | ||
+ | </algo></br> | ||
+ | =====Характеристики алгоритма (Для суммирования массива порядка n):===== | ||
+ | * Общее количество вершин: 3n-3 | ||
+ | * Длина критического пути: | ||
+ | **n−1 ярусов делений | ||
+ | **n−1 ярусов умножений | ||
+ | **n−1 ярусов сложений (вычитаний) | ||
+ | * Каноническая ширина ЯПФ: 1 | ||
+ | На рисунке изображён граф алгоритма без входных и выходных данных для случая суммирования 25 элементов массива на 5 процессорах.</br> | ||
+ | |||
=='''Простой алгоритм Кули-Тьюки быстрого преобразования Фурье для степеней двойки'''== | =='''Простой алгоритм Кули-Тьюки быстрого преобразования Фурье для степеней двойки'''== | ||
=='''Метод Гивенса (вращений) QR-разложения квадратной матрицы'''== | =='''Метод Гивенса (вращений) QR-разложения квадратной матрицы'''== |
Версия 19:06, 17 мая 2021
Содержание
- 1 УМНОЖЕНИЕ МАТРИЦЫ НА ВЕКТОР
- 2 ПЕРЕМНОЖЕНИЕ МАТРИЦ
- 3 НАХОЖДЕНИЕ СУММЫ ЭЛЕМЕНТОВ МАССИВА СДВАИВАНИЕМ
- 4 ПОСЛЕДОВАТЕЛЬНО-ПАРАЛЛЕЛЬНЫЙ МЕТОД СУММИРОВАНИЯ
- 5 Компактная схема метода Гаусса для трёхдиагональной матрицы
- 6 Простой алгоритм Кули-Тьюки быстрого преобразования Фурье для степеней двойки
- 7 Метод Гивенса (вращений) QR-разложения квадратной матрицы
1 УМНОЖЕНИЕ МАТРИЦЫ НА ВЕКТОР
1.1 Ссылка на описание в энциклопедии AlgoWiki:
Умножение плотной неособенной матрицы на вектор
1.2 Реализация алгоритма на Си:
for(int i = 0; i < size; i++)
- for(int j = 0; j < size ; j++)
- vec_out[i] += matrix[i][j] * vec _in[j];
- vec_out[i] += matrix[i][j] * vec _in[j];
1.3 Описание алгоритма на Algolang:
<algo>
- <params>
- <param name="n" type="int" value="5"></param>
- <param name="m" type="int" value="4"></param>
- <param name="n" type="int" value="5"></param>
- </params>
- <block dims="2">
- <arg name="i" val="1..m"></arg>
- <arg name="j" val="1..n+1"></arg>
- <vertex condition="j>1" type="2">
- <in src="i,j-1"></in>
- <in src="i,j-1"></in>
- </vertex>
- <arg name="i" val="1..m"></arg>
- </block>
</algo>
1.4 Характеристики алгоритма (Для умножения матрицы размером m строк на n столбцов на вектор порядка n):
- Общее количество вершин: m*n+m
- Длина критического пути: n
- Каноническая ширина ЯПФ: m
На рисунках представлен результат для матрицы размером 4*5 и вектора длины 5
2 ПЕРЕМНОЖЕНИЕ МАТРИЦ
2.1 Ссылка на описание в энциклопедии AlgoWiki:
Перемножение плотных неособенных матриц
2.2 Реализация алгоритма на Си:
for ( int i=0; i<size_1_str;i++)
- for (int j=0; j<size_2_col;j++)
- {
- matrix_out[i][j]=0;
- for(int k=0; k<size_common;k++)
- matrix_out[i][j]+=matrix_1[i][k]*matrix_2[k][j];
- matrix_out[i][j]+=matrix_1[i][k]*matrix_2[k][j];
- matrix_out[i][j]=0;
- }
2.3 Описание алгоритма на Algolang:
<algo>
- <params>
- <param name="m" type="int" value="4"></param>
- <param name="n" type="int" value="5"></param>
- <param name="l" type="int" value="6"></param>
- <param name="m" type="int" value="4"></param>
- </params>
- <block id="1" dims="3">
- <arg name="i" val="1..m"></arg>
- <arg name="j" val="1..l"></arg>
- <arg name="k" val="1..n+1"></arg>
- <vertex condition="k>1" type="3">
- <in src="i,j,k-1"></in>
- <in src="i,j,k-1"></in>
- </vertex>
- <arg name="i" val="1..m"></arg>
- </block>
</algo>
2.4 Характеристики алгоритма (Для умножения матрицы размером m строк на n столбцов на матрицу размером n строк на l столбцов):
- Общее количество вершин: m*n*l
- Длина критического пути: n
- Каноническая ширина ЯПФ: m*l
На рисунках представлено изображение графа алгоритма выходных данных для случая перемножения двух квадратных матриц порядка 4*5 и 5*6
3 НАХОЖДЕНИЕ СУММЫ ЭЛЕМЕНТОВ МАССИВА СДВАИВАНИЕМ
3.1 Ссылка на описание в энциклопедии AlgoWiki:
Нахождение суммы элементов массива сдваиванием
3.2 Реализация алгоритма на Си:
for(int i=1;i<=h;i++)
- for(int j=0;j<arr_size;j++)
- if(j<(arr_size/(pow(2,i))))
- arr[j]=arr[j*2]+arr[2*j+1];
- arr[j]=arr[j*2]+arr[2*j+1];
- if(j<(arr_size/(pow(2,i))))
3.3 Описание алгоритма на Algolang:
<algo>
- <params>
- <param name="n" type="int" value="8"></param>
- <param name="n" type="int" value="8"></param>
- </params>
- <block dims="2">
- <arg name="i" val="1..((2)log(n)+1)"></arg>
- <arg name="j" val="1..n"></arg>
- <vertex condition="(i>1)and(j<=(n/(2^(i-1))))" type="1">
- <in src="i-1,j*2-1"></in>
- <in src="i-1,j*2"></in>
- <in src="i-1,j*2-1"></in>
- </vertex>
- <arg name="i" val="1..((2)log(n)+1)"></arg>
- </block>
</algo>
3.4 Характеристики алгоритма (для суммирования массива порядка n):
- Общее количество вершин: n-1
- Длина критического пути: [Log2n]
- Каноническая ширина ЯПФ: n
На рисунке изображён граф алгоритма. В данном случае выполнено суммирование 8 элементов массива. Вершины, соответствующие входным данным, обозначены октаэдром.
4 ПОСЛЕДОВАТЕЛЬНО-ПАРАЛЛЕЛЬНЫЙ МЕТОД СУММИРОВАНИЯ
4.1 Ссылка на описание в энциклопедии AlgoWiki:
Последовательно-параллельный метод суммирования
4.2 Описание алгоритма на Algolang:
<algo>
- <params>
- <param name="n" type="int" value="25"></param>
- <param name="p" type="int" value="5"></param>
- <param name="n" type="int" value="25"></param>
- </params>
- <block id="0" dims="2">
- количество процессоров
- <arg name="i" val="1..p"></arg>
- на каждый процессор, кроме одного, распределяется одинаковое количество
- элементов массива (n/p, округленное в бОльшую сторону)
- <arg name="j" val="1..n"></arg>
- <arg name="j" val="1..ceil(n/p)"></arg>
- сумма элементов массива, равномерно распределенных по (p-1) процессорам
- <vertex condition="(j>1)and(i>1)and(j<ceil(n/p))" type="1">
- <in src="i,j-1"></in>
- <in src="i,j-1"></in>
- </vertex>
- сумма оставшихся эелементов
- <vertex condition="(j>1)and(i=1)and(j<=(n-p-(ceil(n/p)-1)*(p-1)))" type="1">
- <in src="i,j-1"></in>
- <in src="i,j-1"></in>
- </vertex>
- последовательное суммирование получившихся сумм на одном из процессоров
- <vertex condition="(i>2)and(j=ceil(n/p))" type="1">
- <in src="i-1,j"></in>
- <in src="i,j-1"></in>
- </vertex>
- <vertex condition="(i=2)and(j=ceil(n/p))" type="1">
- <in src="i-1,n-p-(ceil(n/p)-1)*(p-1)"></in></in>
- <in src="i,j-1"></in>
- </vertex>
- </block>
</algo>
4.3 Характеристики алгоритма (Для суммирования массива порядка n):
- Общее количество вершин: n-1
- Длина критического пути:
- ceil(n/p)-1 - суммирования по частям массива (p ветвей)
- p-1 - одна последовательная ветвь
- Каноническая ширина ЯПФ: p
На рисунке изображён граф алгоритма без входных и выходных данных для случая суммирования 25 элементов массива на 5 процессорах.
5 Компактная схема метода Гаусса для трёхдиагональной матрицы
5.1 Ссылка на описание в энциклопедии AlgoWiki:
Компактная схема метода Гаусса для трёхдиагональной матрицы
5.2 Описание алгоритма на Algolang:
<algo>
- <params>
- <param name="n" type="int" value="6"></param>
- <param name="n" type="int" value="6"></param>
- </params>
- <block id="0" dims="2">
- <arg name="j" val="1..n"></arg>
- <arg name="i" val="1..n"></arg>
- деление
- <vertex condition="(i=j+1)and(j>1)" type="1">
- <in src="j,j"></in>
- <in src="j,j"></in>
- </vertex>
- вычетание
- <vertex condition="(j=i)and(j>1)" type="2">
- <in src="j,i-1"></in>
- <in src="j,i-1"></in>
- </vertex>
- умножение
- <vertex condition="j=i+1" type="3">
- <in src="j-1,i+1"></in>
- <in src="j-1,i+1"></in>
- </vertex>
- </block>
</algo>
5.3 Характеристики алгоритма (Для суммирования массива порядка n):
- Общее количество вершин: 3n-3
- Длина критического пути:
- n−1 ярусов делений
- n−1 ярусов умножений
- n−1 ярусов сложений (вычитаний)
- Каноническая ширина ЯПФ: 1
На рисунке изображён граф алгоритма без входных и выходных данных для случая суммирования 25 элементов массива на 5 процессорах.