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

Паралельная программа умножения матрицы на вектор

06.09.2020, 14:03. Показов 1092. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Может кто помочь сделать паралельную программу умножения квадратной матрицы на вектор, причем n>=100
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.09.2020, 14:03
Ответы с готовыми решениями:

Написать процедуру для сложения, умножения квадратных матриц N*N, и умножения матрицы на вектор
Написать процедуру для сложения, умножения квадратных матриц N*N, и умножения матрицы на вектор

Получить в результате умножения исходной матрицы А(6,7) на вектор-столбец В(7) вектор С(6), каждый элемент которого вычисляется по формуле
Помогите сделать еще одну прогу!!! - Дана действительная матрица А(6,7) и вектор-столбец В(7). Получить в результате умножения исходной...

Параллельный алгоритм умножения матрицы на вектор, основанный на блочном разделении матрицы
Подкиньте пожалуйста ссылок с реализацией след. алгоритмов на C#: 1. Параллельный алгоритм умножения матрицы на вектор, основанный на...

2
 Аватар для Nishen
1355 / 854 / 365
Регистрация: 26.02.2015
Сообщений: 3,806
06.09.2020, 14:40 2
Для начала создай без использования потоков такую фукнцию.

C++ Скопировано
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
83
84
85
86
87
88
89
90
91
92
93
#include <iostream>
#include <thread>
#include <vector>
 
 
class Matrix {
 
public:
    Matrix() :
        storage_(), rows_(0), cols_(0) { };
 
    Matrix(std::size_t rows = 0, std::size_t cols = 0, int value = 0) :
        storage_(rows, std::vector<int>(cols, value)),
        rows_(rows),
        cols_(cols)
    { }
 
    friend std::ostream& operator<<(std::ostream& os, const Matrix& matrix) {
 
        for (const auto& row : matrix.storage_) {
 
            for (const auto& el : row)
                os << el << ' ';
            os << '\n';
 
        }
 
        return os;
 
    }
 
    std::size_t getRowsNumber() const {
 
        return rows_;
 
    }
 
    std::size_t getColsNumber() const {
 
        return cols_;
 
    }
 
    int& operator()(std::size_t row, std::size_t col) {
 
        return storage_[row][col];
 
    }
 
    const int& operator()(std::size_t row, std::size_t col) const {
 
        return storage_[row][col];
        
    }
 
private:
    std::vector<std::vector<int>> storage_;
    std::size_t rows_;
    std::size_t cols_;
 
};
 
std::vector<int> multi(const Matrix& matrix, const std::vector<int>& vec) {
 
    if (matrix.getColsNumber() != vec.size())
        throw std::invalid_argument("The columns number of the matrix "
            "isn't equal to the vector's size");
 
    std::vector<int> result;
    result.resize(vec.size());
 
    for (std::size_t i = 0; i < matrix.getRowsNumber(); ++i)
        for (std::size_t j = 0; j < matrix.getColsNumber(); ++j)
            result[i] += matrix(i, j) * vec[j];
 
    return result;
 
}
 
 
int main() {
 
    Matrix matrix(4, 4, 2);
 
    std::vector<int> vec = multi(matrix, { 4, 4, 4, 4 });
 
    for (const auto& el : vec)
        std::cout << el << ' ';
    std::cout << '\n';
 
    return 0;
 
}
Добавлено через 14 секунд
Теперь подумай, как тут можно использовать потоки.
0
76 / 68 / 10
Регистрация: 11.07.2016
Сообщений: 320
06.09.2020, 16:51 3
Вроде нормально (не считая общего качества кода, конечно). Попробуй теперь сам разобраться как это дело перенести с голых указателей на нормальную матрицу. Например, на ту, что в предыдущем комментарии.

C++ Скопировано
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <thread>
#include <iostream>
#include <iomanip>
#include <vector>
#include <queue>
#include <mutex>
 
void m_fill(int** mat, int n)
{
    std::srand(std::time(0));
 
    for (int i = 0; i < n; ++i)
        for (int j = 0; j < n; ++j)
            mat[i][j] = std::rand() % 10 - 5;
}
 
void v_fill(int* vec, int n)
{
    std::srand(std::time(0));
 
    for (int i = 0; i < n; ++i)
            vec[i] = std::rand() % 15 - 7;
}
 
class simple_work_queue
{
public:
    simple_work_queue(const int size)
    {
        for (int i = size - 1; i >= 0; --i)
            work_queue.push(i);
    }
 
    ~simple_work_queue() {};
 
    int dequeue()
    {
        std::unique_lock<std::mutex> lock(queue_mutex);
        
        if (!work_queue.empty())
        {
            int val = work_queue.front();
            work_queue.pop();
            return val;
        }
    }
 
    bool empty()
    {
        std::unique_lock<std::mutex> lock(queue_mutex);
 
        if (work_queue.empty()) return true;
        else return false;
    }
private:
    std::mutex queue_mutex;
    std::queue<int> work_queue;
};
 
void parallel_MxV(int** matrix, int* vector, int* out, int size, simple_work_queue& works)
{
    for (; !works.empty();)
    {
        int line = works.dequeue();
 
        for (int i = 0; i < size; ++i)
        {
            out[line] += matrix[line][i] * vector[i];
        }
    }
}
 
int main()
{
    unsigned th_number = std::thread::hardware_concurrency();
    if (!th_number) th_number = 4;
    const int size = 10;
 
    int** matrix = new int* [size];
    for (int i = 0; i < size; ++i)
        matrix[i] = new int[size] {};
 
    int* vector = new int[size] {};
    int* result = new int[size] {};
 
    m_fill(matrix, size);
    v_fill(vector, size);
 
    simple_work_queue work_queue(size);
 
    std::vector<std::thread> thread_pool;
 
    for (int i = 0; i < th_number; ++i)
        thread_pool.emplace_back(parallel_MxV, matrix, vector, result, size, std::ref(work_queue));
    
    for (auto& t : thread_pool)
        t.join();
 
    delete[] vector;
    delete[] result;
    for (int i = 0; i < size; ++i)
    {
        delete[] matrix[i];
    }
    delete[] matrix;
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.09.2020, 16:51
Помогаю со студенческими работами здесь

не могу сделать так чтоб я сам вводил матрицы) задача умножения матрицы на вектор
Всем привет. вобщем задача моя такова , что я задал готовое количество элементов в матрицу и в вектор, а программа умножает ее. сами задаем...

Функция умножения матрицы на вектор
Как это дело делается я понимаю. Функцию написал, но с передачей значений путаюсь. void mvm( int **matr, int *vect, int *res) ...

Процедура умножения матрицы на вектор
Есть квадратная матрица А порядка n и вектор b с n элементами. Получить вектор А * b. Оформить в виде подпрограмм-процедур в программе

Процедура умножения матрицы на вектор
USES Crt; CONST n = 3; m = 4; TYPE MatrA = ARRAY OF REAL; MatrB = ARRAY OF REAL; MatrC = ARRAY OF REAL;

Процедура умножения матрицы на вектор
Задание гласит: Разработать программный модуль (ПМ), в котором содержится не менее 4 подпрограмм: 9.1 Процедура введения...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Простая нейросеть на КуМир: Создание и обучение
EggHead 16.03.2025
Искусственные нейронные сети — удивительная технология, позволяющая компьютерам имитировать работу человеческого мозга. Если вы хотя бы немного интересуетесь современными технологиями, то наверняка. . .
Исполнитель Кузнечик в КуМир: Решение задач
EggHead 16.03.2025
Среди множества исполнителей в системе КуМир особое место занимает Кузнечик — простой, но невероятно полезный виртуальный персонаж, который перемещается по числовой прямой, выполняя ваши команды. На. . .
Исполнитель Водолей в КуМир: Решение задач
EggHead 16.03.2025
Разработка алгоритмического мышления — одна из ключевых задач для начинающих программистов, и система КуМир предлагает отличный способ погрузиться в этот процесс. Среди множества исполнителей в этой. . .
Исполнитель Чертежник в КуМир: Решение задач
EggHead 16.03.2025
Представьте, что вы можете рисовать на бесконечной координатной плоскости, перемещая точку, которая оставляет след. По вашей команде она может поднять перо и двигаться, не оставляя следа, или. . .
Исполнитель Робот в КуМир: Решение задач
EggHead 16.03.2025
КуМир (Комплект Учебных МИРов) — это учебная среда программирования, разработанная специально для обучения базовым концепциям алгоритмизации. Её главная фишка — использование русскоязычного. . .
Исполнитель Черепаха в КуМир: Решение задач
EggHead 16.03.2025
Представьте, что вы впервые учитесь программировать, а перед вами стоит задача заставить маленькую виртуальную черепашку рисовать на экране. Звучит забавно? Эта идея зародилась ещё в 1967 году, когда. . .
Конвейеры данных с Apache Kafka
Javaican 16.03.2025
В мире, где данные стали новой нефтью, Apache Kafka зарекомендовал себя как мощный инструмент для построения надежных и масштабируемых конвейеров данных. Созданный изначально командой LinkedIn в 2011. . .
Deno против Node.js: Будущее JavaScript рантайма
run.dev 16.03.2025
За последнее десятилетие Node. js стал абсолютным лидером среди JavaScript-рантаймов и фактическим стандартом для серверной разработки на JavaScript. Но в 2018 году тот же разработчик, который создал. . .
SwiftUI или UIKit - что выбрать для нового приложения iOS?
mobDevWorks 16.03.2025
Когда Apple представила SwiftUI на WWDC 2019, многим показалось, что дни UIKit сочтены. Новый декларативный фреймворк предлагал радикально иной подход к разработке интерфейсов. Вместо кропотливого. . .
Docker: Руководство для начинающих по созданию первого приложения
Mr. Docker 16.03.2025
Docker — это платформа, которая упаковывает ваше приложение и все его зависимости в стандартизированные блоки, называемые контейнерами. Эти контейнеры изолированы друг от друга и от основной системы,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер