Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 27.12.2018
Сообщений: 53
1

Оптимизация перемножения матриц

27.12.2018, 13:21. Просмотров 543. Ответов 3

В конечном итоге нужно получить результат не менее 2500 (самый последний вывод).
Вот код:

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
#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <cmath>
#include <chrono>
using namespace std;
 
 
 
int main() {
 
    int n = 800, i, j, k; // i - строка , j - столбец
    double time;
 
    float **Mat1 = new float *[n];
    float **Mat2 = new float *[n];
    float **Mat3 = new float *[n];
    float **Mat4 = new float *[n];
    //Доопределение первого массива и его заполнение 
    for (i = 0; i < n; i++) {
        Mat1[i] = new float[n];
    }
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++){
            Mat1[i][j] = 2.00;
        }
    }
    //Доопределение второго массива и его заполнение 
    for (i = 0; i < n; i++) {
        Mat2[i] = new float[n];
    }
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            Mat2[i][j] = 3.00;
        }
    }
    //Доопределение третьего массива
    for (i = 0; i < n; i++) {
        Mat3[i] = new float[n];
    }
    //Доопределение четвёртогоо масиива
    for (i = 0; i < n; i++) {
        Mat4[i] = new float[n];
    }
    //Перемножение матриц
    auto start = std::chrono::high_resolution_clock::now();
 
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            Mat4[i][j] = Mat2[j][i];
        }
    }
 
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
                for(k = 0; k < n; k++)  Mat3[i][j] += Mat1[i][k] * Mat4[i][k];
        
        }
    }
 
    auto end = std::chrono::high_resolution_clock::now();
    chrono::duration<double> timer = end - start;
 
    cout << "Time: " << timer.count() << endl;
    time = ((2 * (pow(800, 3)) / (timer.count()))*pow(10, -6));
    cout << time << " flops" << endl;
 
    system("pause");
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.12.2018, 13:21
Ответы с готовыми решениями:

Оптимизация перемножения матриц
Доброго времени суток! Помогите пожалуйста с оптимизацией перемножения матриц. Транспонировал,...

Оптимизация алгоритма перемножения двух матриц
Здравствуйте, нужна помощь. Есть 2 матрицы, нужно их перемножить так, что бы алгоритм выполнялся...

Программа перемножения 2 матриц
ДОброго времени суток прошу помочь написать программу перемножения 2 матриц,матрицы вводятся с...

Функция перемножения матриц.
Функция mult, прошу помощи, ибо не пойму в чем ошибка. #include &lt;iostream&gt; #include &lt;math.h&gt;...

3
2178 / 1696 / 848
Регистрация: 21.12.2010
Сообщений: 3,006
Записей в блоге: 11
27.12.2018, 17:35 2
Если n сделать константой и оно не слишком большое, то первое измерение матриц можно создавать на стеке:
C++
1
2
3
4
float *Mat1[n];
for (i = 0; i < n; i++) {
    Mat1[i] = new float[n];
}
0
1008 / 919 / 138
Регистрация: 19.02.2010
Сообщений: 2,874
27.12.2018, 19:57 3
White Fox, Вот как-то так должен быть переделан расчёт (последний строенный цикл).
C
1
2
3
4
5
6
7
8
9
10
11
12
for (i = 0; i < n; i++) {
    //указатели на i-е строки в соответствующих матрицах
    float *L3=Mat3[i];
    float *L1=Mat1[i];
    float *L4=Mat4[i];
    for (j = 0; j < n; j++) {
        float res=0.f;
        for(k = 0; k < n; k++)
            res+=L1[k]*L4[k];
        L3[j]=res;
    }
}
В общем, всё, что внутри цикла не меняется - выносится вне этого цикла.
Но Ваши ошибки я исправлять не стал В том смысле - что у Вас код перемножения неправильный, и я его таким и оставил, указав только на нужную для оптимизации идею. Хотя нет - одну ошибку (отсутствие предварительного обнуления матрицы результата) всё-таки исправил


Цитата Сообщение от igorrr37 Посмотреть сообщение
то первое измерение матриц можно создавать на стеке:
Если внимательно посмотреть на код ТСа - то можно увидеть, что время создания-инициализации матриц не входит в замеряемое время.
0
1346 / 986 / 312
Регистрация: 28.07.2012
Сообщений: 2,743
27.12.2018, 21:35 4
White Fox, создавай матрицы следующим образом:
C++
1
2
3
4
float **Mat = new float *[n];
Mat[0] = new float[n * n];
for (int i = 1; i < n; ++i)
  Mat[i] = Mat[i - 1] + n;
Это уменьшит количество кэш-промахов в процессоре.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.12.2018, 21:35

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Оператор перемножения матриц
не работает оператор* двух матриц, никак не могу понять как сделать так, чтобы в операторе была уже...

Ошибка в коде перемножения матриц
Ребята , здравствуйте, нужна nомощь, наnисал код nеремножений 2-х матрицы. Но nри выводе матриц...

Написать процедуру перемножения матриц.
ребят нужна помощь Задачи по программированию. Задача решается на двух языках. Задача 8....

Функции перемножения матриц и суммирования их элементов
1. Вычисление суммы элементов нечетных строк матрицы. 2. Перемножение матриц. Операции проводить...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.