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

Правильно ли код посчитал алгоритм Винограда?

19.11.2021, 14:27. Показов 1194. Ответов 5

Студворк — интернет-сервис помощи студентам
Здравствуйте, подскажите пожалуйста, правильно ли я составил алгоритм Винограда, если нет, то как тогда исправить?
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 <vector>
 
using namespace std;
 
int main()
{
    int N;
    int tmp;
    vector <int> rowFactor;
    vector <int> columnFactor;
    cout << "Enter the sizes of the square matrices: ";
    cin>>N;
    int a[N][N];
    int b[N][N];
    int c[N][N];
 
    int d = N/2;
    for(int i = 0; i<N; i++)
    {
        for(int j = 0; j<N; j++)
        {
            a[i][j] = rand()%20;
            b[i][j] = rand()%20;
        }
    }
 
    cout << endl <<"Matrix A:"<<endl;
 
    for (int i = 0; i<N; i++)
    {
        for (int j = 0; j<N; j++)
        {
            cout.width (3);
            cout << a[i][j];
        }
        cout << endl;
    }
    
    cout << endl <<"Matrix B:"<<endl;
    
    for (int i = 0; i<N; i++)
    {
        for (int j = 0; j<N; j++)
        {
            cout.width (3);
            cout << b[i][j];
        }
        cout << endl;
    }
    
    for (int i = 0; i<N; ++i)
    {
        rowFactor.insert(rowFactor.end(), a[i][1]*a[i][2]);
        for (int j = 0; j<d; ++j)
        {
            rowFactor.insert(rowFactor.end(),rowFactor[i] + a[i][2*j - 1] * a[i][2*j]);
        }
    } 
 
    for (int i = 0; i<N; ++i)
    {
        columnFactor.insert(columnFactor.end(), b[i][1]*b[i][2]);
        for (int j = 0; j<d; ++j)
        {
            columnFactor.insert(columnFactor.end(), columnFactor[i] +  b[2*j - 1][ i] * b[2*j][ i]);
        }
    }
 
    for (int i = 0; i<N; ++i)
    {
        for (int j = 0; j<N; ++j)
        {
            c[i][j] = -rowFactor[i] - columnFactor[j];
 
            for (int k = 0; k<d; k++)
            {
                c[i][j]=c[i][j]+(a[i][ 2*k-1]+b[2*k][j])*(a[i][ 2*k] + b[2*k-1][j]);
            }
        }
    }
    
    cout<<"\nMultiplication of two matrices using Winograd's algorithm:\n"<<endl;
    
    for (int i=0; i<N; i++) 
    {
        for (int j=0; j<N; j++)
            cout << " " << c[i][j];
        cout << endl; 
    }
    
    return 0;
}
P.S
Правильно ли я понимаю, что если произвести умножение матриц обычным способом, то результат будет такой же, если бы я использовал алгоритм Винограда?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.11.2021, 14:27
Ответы с готовыми решениями:

Правильно ли я посчитал следующий ряд
double b = 0; for (int n = 1; n &lt; ilen.size(); n++) { for (int k = 0; k &lt; n; k++) { double t = -pow(ilen - ilen,...

Правильно ли я посчитал количество транзисторов в схеме?
Правильно ли я посчитал количество транзисторов в схеме?

Правильно ли я посчитал параметры добавочного резистора?
Стандартнейший пример: источник тока - 12 вольт постоянного, лампа - 6В 0.3А, какой нужен резистор? Вроде там имеют значения 2 параметра:...

5
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
19.11.2021, 14:54
Цитата Сообщение от funmanta Посмотреть сообщение
Правильно ли я понимаю, что если произвести умножение матриц обычным способом, то результат будет такой же, если бы я использовал алгоритм Винограда?
Должен быть, да.

Вот этот код выглядит крайне сомнительным:
C++
1
2
3
4
5
6
7
8
    for (int i = 0; i<N; ++i)
    {
        rowFactor.insert(rowFactor.end(), a[i][1]*a[i][2]);
        for (int j = 0; j<d; ++j)
        {
            rowFactor.insert(rowFactor.end(),rowFactor[i] + a[i][2*j - 1] * a[i][2*j]);
        }
    }
Я, конечно, уже плохо помню за давностью лет, но в алгоритме факторы считались явно не так.

Ну и отрицательные значения в результирующей матрице какбэ намекают, что работает неправильно.
1
4 / 4 / 0
Регистрация: 28.08.2021
Сообщений: 173
19.11.2021, 15:06  [ТС]
lemegeton, по правилу вроде бы я правильно написал, но ответы не сходятся с тем как я умножил обычным способом. Может конечно я с факторами и напутал

Добавлено через 2 минуты
lemegeton, Подскажите как это исправить
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
19.11.2021, 15:37
Лучший ответ Сообщение было отмечено funmanta как решение

Решение

Цитата Сообщение от funmanta Посмотреть сообщение
lemegeton, по правилу вроде бы я правильно написал, но ответы не сходятся с тем как я умножил обычным способом. Может конечно я с факторами и напутал
Там довольно много ошибок.

Кликните здесь для просмотра всего текста

Несколько исправленная версия, но всё равно нерабочая.
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
#include <iostream>
#include <vector>
#include <iomanip>
 
using namespace std;
 
int main() {
    constexpr int N = 4;
 
    int a[N][N];
    int b[N][N];
    int c[N][N];
 
    int d = N / 2;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            a[i][j] = rand() % 5;
            b[i][j] = rand() % 5;
        }
    }
 
    cout << endl << "Matrix A:" << endl;
 
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            cout.width(3);
            cout << a[i][j];
        }
        cout << endl;
    }
 
    cout << endl << "Matrix B:" << endl;
 
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            cout.width(3);
            cout << b[i][j];
        }
        cout << endl;
    }
 
    vector<int> rowFactor(N, 0);
    for (int i = 0; i < N; ++i) {
        rowFactor[i] = a[i][0] * a[i][1];
        for (int j = 1; j < d; ++j) {
            rowFactor[i] += a[i][2 * j - 1] * a[i][2 * j];
        }
    }
 
    vector<int> columnFactor(N, 0);
    for (int i = 0; i < N; ++i) {
        columnFactor[i] = b[i][0] * b[i][1];
        for (int j = 1; j < d; ++j) {
            columnFactor[i] += b[2 * j - 1][i] * b[2 * j][i];
        }
    }
 
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            c[i][j] = -rowFactor[i] - columnFactor[j];
            for (int k = 0; k < d; k++) {
                // при k == 0 индекс 2 * k - 1 == -1, выход за пределы массива.
                c[i][j] = c[i][j] + (a[i][2 * k - 1] + b[2 * k][j]) * (a[i][2 * k] + b[2 * k - 1][j]);
            }
        }
    }
 
    cout << "\nMultiplication of two matrices using Winograd's algorithm:\n" << endl;
 
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++)
            cout << " " << c[i][j];
        cout << endl;
    }
 
    std::cout << std::endl << "Original multiplication: " << std::endl;
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            int x = 0;
            for (int k = 0; k < N; ++k) {
                x += a[i][k] * b[k][j];
            }
            std::cout << std::setw(5) << x;
        }
        std::cout << std::endl;
    }
 
    return 0;
}


Цитата Сообщение от funmanta Посмотреть сообщение
lemegeton, Подскажите как это исправить
Не подскажу, надо сидеть и разбираться, что хотел сказать автор.
Единственное описание алгоритма, которое я нашел, содержит откровенные ошибки типа выхода за пределы массива.

Добавлено через 14 минут
Гребаные отклонения в психике.
Я разобрался. В алгоритме на народе странное понимание индексации.

Вот так надо.
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
#include <iostream>
#include <vector>
#include <iomanip>
 
using namespace std;
 
int main() {
    constexpr int N = 5;
 
    int a[N][N];
    int b[N][N];
    int c[N][N];
 
    int d = N / 2;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            a[i][j] = rand() % 5;
            b[i][j] = rand() % 5;
        }
    }
 
    cout << endl << "Matrix A:" << endl;
 
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            cout.width(3);
            cout << a[i][j];
        }
        cout << endl;
    }
 
    cout << endl << "Matrix B:" << endl;
 
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            cout.width(3);
            cout << b[i][j];
        }
        cout << endl;
    }
 
    vector<int> rowFactor(N, 0);
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < d; ++j) {
            rowFactor[i] += a[i][2 * j] * a[i][2 * j + 1];
        }
    }
 
    vector<int> columnFactor(N, 0);
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < d; ++j) {
            columnFactor[i] += b[2 * j][i] * b[2 * j + 1][i];
        }
    }
 
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            c[i][j] = -rowFactor[i] - columnFactor[j];
            for (int k = 0; k < d; k++) {
                c[i][j] = c[i][j] + (a[i][2 * k + 1] + b[2 * k][j]) * (a[i][2 * k] + b[2 * k + 1][j]);
            }
        }
    }
 
    // поправочка на нечётность
    if (N % 2 == 1) {
        for (size_t i = 0; i < N; i++) {
            for (size_t j = 0; j < N; j++) {
                c[i][j] += a[i][N - 1] * b[N-1][j];
            }
        }
    }
 
    cout << "\nMultiplication of two matrices using Winograd's algorithm:\n" << endl;
 
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++)
            cout << " " << c[i][j];
        cout << endl;
    }
 
    std::cout << std::endl << "Original multiplication: " << std::endl;
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            int x = 0;
            for (int k = 0; k < N; ++k) {
                x += a[i][k] * b[k][j];
            }
            std::cout << std::setw(5) << x;
        }
        std::cout << std::endl;
    }
 
    return 0;
}
1
4 / 4 / 0
Регистрация: 28.08.2021
Сообщений: 173
19.11.2021, 15:39  [ТС]
lemegeton, я исправил 63 строку, но всё равно не совпадают результаты
Цитата Сообщение от lemegeton Посмотреть сообщение
c[i][j] = c[i][j] + (a[i][2 * k - 1] + b[2 * k][j]) * (a[i][2 * k] + b[2 * k - 1][j]);
C++
1
c[i][j] = c[i][j] + (a[i][2*k] + b[2*k + 1][j]) * (a[i][2*k + 1] + b[2*k][j]);
Миниатюры
Правильно ли код посчитал алгоритм Винограда?  
0
4 / 4 / 0
Регистрация: 28.08.2021
Сообщений: 173
19.11.2021, 15:43  [ТС]
lemegeton, спасибо огромное
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.11.2021, 15:43
Помогаю со студенческими работами здесь

Правильно ли я посчитал сложность алгоритма Шелла?
Проверьте пожалуйста, правильно ли я посчитал сложность алгоритма Шелла? Ато с википедией не сходиться. void shel(ref int Mas) //...

Алгоритм Винограда
Необходимо рассчитать 20-точечный алгоримт Винограда на Маткаде. Для перемножения матриц использую кронеккеровское умножение (почти), но...

Алгоритм Штрассена-Винограда
Добрый день всем, нужна помощ в написании алгоритма. Нужен алгоритм который не будет создавать динамические матрицы при каждой рекурсии и...

Алгоритм Штрассена-Винограда
Здравствуйте, нужна помощь , не могу найти ошибку в коде из-за которой умножение не происходит должным образом . Может кто-то заметит и...

Алгоритм Штрасенна-Винограда (умножение матриц)
Ну вообщем задание у меня реализовать алгоритм Штрасенна Винограда, но у меня он фигово работает. Можете пожалуйста доработать или...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru