DAS_2024_1/bazunov_andrew_lab_6
2024-12-20 01:00:01 +04:00
..
main.py ready 2024-11-28 23:56:00 +04:00
matrix.py ready 2024-11-28 23:56:00 +04:00
README.md Видео отчет 2024-12-20 01:00:01 +04:00

Распределенные вычисления и приложения Л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