.. | ||
main.py | ||
matrix.py | ||
README.md |
Распределенные вычисления и приложения Л6
Автор Базунов Андрей Игревич ПИбд-42
Задание
- Кратко: реализовать нахождение детерминанта квадратной матрицы. Что такое детерминант матрицы (или определитель)
- Подробно: в лабораторной работе требуется сделать два алгоритма: обычный и параллельный (задание со * - реализовать это в рамках одного алгоритма). В параллельном алгоритме предусмотреть ручное задание количества потоков (число потоков = 1 как раз и реализует задание со *), каждый из которых будет выполнять нахождение отдельной группы множителей.
Алгоритм:
Функция вычисления определителя матрицы
Код
def minor(matrix, i, j):
return [row[:j] + row[j + 1:] for row in (matrix[:i] + matrix[i + 1:])]
def determinant(matrix: list, threads=1) -> float:
if len(matrix) == 1:
return matrix[0][0]
elif len(matrix) == 2:
return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]
det = 0
futures = []
with ThreadPoolExecutor(max_workers=threads) as executor:
for col in range(len(matrix)):
cofactor = (-1) ** col * matrix[0][col]
futures.append(executor.submit(lambda m, cof: cof * determinant(m), minor(matrix, 0, col), cofactor))
for future in futures:
det += future.result()
return det
Размер матрицы | 1 Поток (сек) | 5 Потоков (сек) | 20 Потоков (сек) |
---|---|---|---|
1x1 | 0.0 | 0.0 | 0.0 |
2x2 | 0.0 | 0.0 | 0.0 |
3x3 | 0.00018 | 0.00019 | 0.00017 |
4x4 | 0.00061 | 0.00072 | 0.0007 |
5x5 | 0.00247 | 0.00359 | 0.00336 |
6x6 | 0.01306 | 0.01931 | 0.02129 |
7x7 | 0.08692 | 0.14062 | 0.15682 |
8x8 | 0.59383 | 1.03971 | 1.27658 |
9x9 | 5.23021 | 9.72031 | 11.71564 |
Видео отчет: https://vkvideo.ru/video236673313_456239579