Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 05.07.2019
Сообщений: 43

Многопоточное перемножение матриц

14.09.2021, 23:30. Показов 722. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание:

Реализовать класс ParallelMatrixProduct для многопоточного умножения матриц UsualMatrix. В конструкторе класс получает число потоков, которые будут использованы для перемножения (число потоков может быть меньше, чем число строк у первой матрицы).

В функции main сравнить время перемножения больших случайных матриц обычным и многопоточным способом. Получить текущее время можно с помощью методов класса System.

Вот Main
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;
 
public class Main {
 
    public static void main(String[] args) throws InterruptedException {
        UsualMatrix a = new UsualMatrix(3, 4, 0);
        a.randNum();
        System.out.println(a.toString());
        UsualMatrix b = new UsualMatrix(4, 3, 0);
        b.randNum();
        System.out.println(b.toString());
        UsualMatrix res1;
        UsualMatrix res2;
 
 
        long startTime = System.currentTimeMillis();
        res1 = a.mult(b);
        System.out.println("__________________________________");
        System.out.println(res1.toString());
        long estimatedTime = System.currentTimeMillis() - startTime;
        //System.out.print(oneResult);
        System.out.println("Умножается за время: " + estimatedTime + "ms");
 
        ParallelMatrixProduct test = new ParallelMatrixProduct(a, b, Runtime.getRuntime().availableProcessors());
        long startTime1 = System.currentTimeMillis();
        res2 = test.parallelProduct();
        System.out.println(res2.toString());
        long estimatedTime1 = System.currentTimeMillis() - startTime1;
        System.out.println("(Умножается за время): " + estimatedTime1 + "ms");
    }
 
}
ParallelMatrixProduct:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import java.util.stream.Stream;
 
public class ParallelMatrixProduct {
    private int threads;
    private UsualMatrix x;
    private UsualMatrix y;
    private UsualMatrix result;
    private int num;
 
    private class myThread implements Runnable {
        private int index1;
        private int index2;
 
        public myThread(int i, int j) {
            this.index1 = i;
            this.index2 = j;
        }
 
        @Override
        public void run() {
            if (x.col == y.row) {
                for (int k = 0; k < y.col; k++) {
                    result.setEl(this.index1, this.index2, result.getEl(this.index1, this.index2) + x.getEl(this.index1, this.index2) * y.getEl(k, this.index2));
                }
            }
            else {
                System.out.println("-1000");
            }
        }
    }
 
    ParallelMatrixProduct(UsualMatrix x, UsualMatrix y, int threads) {
        this.x = x;
        this.y = y;
        this.threads = threads;
        this.result = new UsualMatrix(x.col, y.row, 0);
    }
 
    public UsualMatrix parallelProduct() throws InterruptedException {
        ExecutorService executorService = Executors.newFixedThreadPool(this.threads);
        for (int i = 0; i < x.row; i++) {
            for (int j = 0; j < y.col; j++) {
                executorService.execute(new myThread(i, j));
            }
        }
        executorService.shutdown();
        executorService.awaitTermination(1, TimeUnit.MILLISECONDS);
        return this.result;
    }
}
UsualMatrix:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import java.util.Random;
 
public class UsualMatrix {
    protected int[][] matrix;
    protected int col;
    protected int row;
 
 
    public UsualMatrix(int data) {
        this.row = data;
        this.col = data;
        this.matrix = new int[data][data];
    }
 
    public UsualMatrix(int size, int val) {
        this.row = size;
        this.col = size;
        this.matrix = new int[size][size];
        for (int i = 0; i < size; i++) {
            for (int j = 0; j < size; j++) {
                matrix[i][j] = val;
            }
        }
    }
 
    public UsualMatrix(int r, int c, int value) {
        this.row = r;
        this.col = c;
        this.matrix = new int[r][c];
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                matrix[i][j] = value;
            }
        }
    }
    public void setEl(int row, int col, int value) {
        this.matrix[row][col] = value;
    }
 
    public int getEl(int row, int col) {
        return this.matrix[row][col];
    }
 
    public void randNum() {
        Random r = new Random();
        this.matrix = new int[this.row][this.col];
        for(int i = 0; i != this.row; i++) {
            for(int j = 0; j != this.col; j++) {
                this.matrix[i][j] = r.nextInt(9) + 1;
            }
        }
    }
 
    public UsualMatrix mult(UsualMatrix mtx) {
        if (this.col == mtx.row) {
            UsualMatrix result = new UsualMatrix(this.row, mtx.col, 0);
            for (int i = 0; i < this.row; i++) {
                for (int j = 0; j < mtx.col; j++) {
                    for (int k = 0; k < this.col; k++) {
                        result.setEl(i, j, result.getEl(i, j) + this.getEl(i, j) * mtx.getEl(k, j));
                    }
                }
            }
            return result;
        } else {
            System.out.println("-1000");
            return this;
        }
    }
 
    public String toString() {
        StringBuilder result = new StringBuilder();
        for (int i = 0; i != this.row; i++) {
            for (int j = 0; j != this.col; j++) {
                result.append("|").append(this.getEl(i, j)).append("|");
            }
            result.append("\n");
        }
        return result.toString();
    }
 
}
Проблема такая: Если умножать разноразмерные матрицы, то появляются нули в умножении от потока. Не могу понять как это убрать, хотя понимаю в чем проблема.
Так же, немного странно, что матрица с потоками дольше умножаются, но если мы создадим матрицу 1000х1000, то они перемножаются на порядок быстрее. Объясните пожалуйста почему так происходит.

|1||7||1||7|
|2||9||5||1|
|2||9||8||9|

|7||8||7|
|6||2||3|
|1||5||9|
|3||2||9|

__________________________________

|17||119||28|
|34||153||140|
|34||153||224|

Умножается за время: 0ms

|14||105||19||0|
|28||135||95||0|
|28||135||152||0|
|0||0||0||0|

(Умножается за время): 13ms
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.09.2021, 23:30
Ответы с готовыми решениями:

Многопоточное перемножение матрицы
Написал класс ParallelMatrixProduct, встроенный в класс UsualMatrix для вычисления произведения несколькими потоками. Класс работает, но...

Многопоточное умножение матриц
какой мехнизм применить для равномерного распределения задач для потоков? например матрицы у меня 10х10 а потоков в конструкторе дано будет...

Перемножение двух матриц.
Есть задание: Прочитать две матрицы с клавиатуры (используя одну статическую функцию), проверить можно ли их перемножить и перемножить...

2
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
15.09.2021, 00:24
Цитата Сообщение от spacekurama Посмотреть сообщение
this.result = new UsualMatrix(x.col, y.row, 0);
Полагаю: this.result = new UsualMatrix(x.row, y.col, 0);.
0
0 / 0 / 0
Регистрация: 05.07.2019
Сообщений: 43
15.09.2021, 22:36  [ТС]
Отлично. Спасибо большое!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.09.2021, 22:36
Помогаю со студенческими работами здесь

Перемножение матриц(квадратных)
Помогите перемножить эти матрицы.Знаю примерный алгоритм,но с реализацией не могу справиться. public class Matrix{ public...

Перемножение двух матриц
Ребята, нужно составить программу перемножения двух матриц. При этом программа обязательно должна состоять из двух классов: Matrix и...

Перемножение прямоугольных матриц
Добрый день! Прошу помочь мне с перемножением двух прямоугольных матриц... Квадратные могу перемножать, а вот с прямоугольными беда... Буду...

Многопоточное перемножение матриц - выход за пределы
Здравствуйте. Язык C# Моя задача: Нужно перемножить две матрицы в несколько потоков, я сделал по одному потоку на строку(по правилам...

Многопоточное приложение: перемножение двух матриц, с комплексными членами
Задача: сделать программу, перемножающим 2 матрицы, с комплексными членами. Проблема - не компилится и не собирается. #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru