Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
71 / 58 / 48
Регистрация: 12.03.2017
Сообщений: 563
1

Умножение матриц

13.09.2017, 17:41. Показов 1379. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, пишу алгоритм умножения матриц, я сначала понять не мог , как реализовать этот алгоритм , потом посмотрел пару примеров и сделал свой, всё работает , но результаты в получившееся матрицы -8484848 и т.д. Память для 3-й матрицы выделял.
Ниже код выделение памяти и сам алгоритм умножения.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        ptr_Array_3 = new int*[column_1];
        for(int i = 0; i < column_1; i++) {
            ptr_Array_3[i] = new int[line_2];
        }
 
        for(int i = 0; i < line_1; i++) {
        
            for(int j = 0; j < column_2; j++) {
            
                    for(int g = 0; g < column_1; g++)
                        ptr_Array_3[i][j] += ptr_Array_1[i][g] * ptr_Array_2[g][j];
 
                    
                }
        
        
            }
Подскажите,что я не так сделал?

Добавлено через 36 секунд
И если не трудно, объясните алгоритм умножения , я всё еще не совсем понимаю.

Добавлено через 3 минуты
line_1 - Количество строк 1-й матрицы.
column_2 - количество столбцов 2-й матрицы
line_2 - количество строк 2-й матрицы
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.09.2017, 17:41
Ответы с готовыми решениями:

Умножение треугольных матриц«Методы обработки разреженных матриц»
Нужно перемножить треугольные матрицы в обычном виде и в свёрнутом. С обычным проблем нет. Доступ...

Умножение матриц
надо получить матрицу А*В

Умножение 3 матриц
вод код моей процедуру { GetMatrixA(A); GetMatrixB(B); GetMatrixD(D); for( p= 1; p&lt;=count;...

Умножение матриц
Даны две квадратные матрицы A и B, вычислить A2B2

14
672 / 475 / 215
Регистрация: 06.09.2013
Сообщений: 1,306
13.09.2017, 18:17 2
По-моему память неправильно выделена. Если первый индекс строка - должно быть сначала количество строк первой матрицы, потом количество столбцов второй.
C++
1
2
3
4
ptr_Array_3 = new int*[line_1];
        for(int i = 0; i < line_1; i++) {
            ptr_Array_3[i] = new int[column_2];
        }
1
69 / 57 / 14
Регистрация: 20.12.2013
Сообщений: 656
13.09.2017, 18:19 3
del
0
71 / 58 / 48
Регистрация: 12.03.2017
Сообщений: 563
13.09.2017, 18:23  [ТС] 4
Цитата Сообщение от woldemas Посмотреть сообщение
По-моему память неправильно выделена. Если первый индекс строка - должно быть сначала количество строк первой матрицы, потом количество столбцов второй.
Исправил на ваше, всё равно не работает. Тот же самый результат
0
672 / 475 / 215
Регистрация: 06.09.2013
Сообщений: 1,306
13.09.2017, 18:26 5
Цитата Сообщение от axela002 Посмотреть сообщение
Дк это же третья матрица,а она получается из столбцов первой матрицы и строк второй матрицы. Или я что то не так понимаю?
Размеры результирующей матрицы - количество строк первой на количество столбцов второй.
1
71 / 58 / 48
Регистрация: 12.03.2017
Сообщений: 563
13.09.2017, 18:28  [ТС] 6
Цитата Сообщение от woldemas Посмотреть сообщение
Размеры результирующей матрицы - количество строк первой на количество столбцов второй.
Цитата Сообщение от axela002 Посмотреть сообщение
Исправил на ваше, всё равно не работает. Тот же самый результат
Вот
0
672 / 475 / 215
Регистрация: 06.09.2013
Сообщений: 1,306
13.09.2017, 18:32 7
Обнули ptrArray[i][j] перед самым вложенным циклом.
0
71 / 58 / 48
Регистрация: 12.03.2017
Сообщений: 563
13.09.2017, 18:34  [ТС] 8
Цитата Сообщение от woldemas Посмотреть сообщение
Обнули ptrArray[i][j] перед самым вложенным циклом.
Не понял, объясни подробнее пожалуйста
0
672 / 475 / 215
Регистрация: 06.09.2013
Сообщений: 1,306
13.09.2017, 18:36 9
Лучший ответ Сообщение было отмечено axela002 как решение

Решение

C++
1
2
3
4
5
6
7
for(int i = 0; i < line_1; i++) {        
            for(int j = 0; j < column_2; j++) {
                    ptr_Array3[i][j] = 0.0;
                    for(int g = 0; g < column_1; g++)
                        ptr_Array_3[i][j] += ptr_Array_1[i][g] * ptr_Array_2[g][j];                    
                }        
            }
1
71 / 58 / 48
Регистрация: 12.03.2017
Сообщений: 563
13.09.2017, 18:39  [ТС] 10
Да заработало, а объясни пожалуйста что дает это обнуление, ведь я его ничего не заполнял, он же и имел 0.
0
672 / 475 / 215
Регистрация: 06.09.2013
Сообщений: 1,306
13.09.2017, 18:40 11
Цитата Сообщение от axela002 Посмотреть сообщение
он же и имел 0
Нет в c++ это не так, по умолчанию не инициализируется память, это в C# так.
1
71 / 58 / 48
Регистрация: 12.03.2017
Сообщений: 563
13.09.2017, 18:41  [ТС] 12
Цитата Сообщение от woldemas Посмотреть сообщение
Нет в c++ это не так, по умолчанию не инициализируется память, это в C# так.
А почему выше две матрицы не выдали таких ошибок, ведь принцип был почти такой же
0
672 / 475 / 215
Регистрация: 06.09.2013
Сообщений: 1,306
13.09.2017, 18:43 13
Цитата Сообщение от axela002 Посмотреть сообщение
А почему выше две матрицы не выдали таких ошибок
Что за матрицы? Я не знаю о чем речь, ты их заполнял наверное поэлементно.
0
71 / 58 / 48
Регистрация: 12.03.2017
Сообщений: 563
13.09.2017, 18:46  [ТС] 14
Цитата Сообщение от woldemas Посмотреть сообщение
Что за матрицы? Я не знаю о чем речь, ты их заполнял наверное поэлементно.
А ну да я забыл вам их показать, у меня еще есть две матрицы которые он заполняет сам через cin , после чего они перемножаются.
Сам- это пользователь в консоле.
0
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
13.09.2017, 19:21 15
Лучший ответ Сообщение было отмечено axela002 как решение

Решение

axela002, здравствуйте! Я перемножал так:

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
#include <bits/stdc++.h>
 
using namespace std;
 
void MatrixInput(int** X, int N, int M)
{
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            cin >> X[i][j];
        }
    }
}
 
int main()
{
    int K, M, N, sum;
    cout << "Введите размеры матрицы A:" << endl;
    cout << "K = ";
    cin >> K;
    cout << "M = ";
    cin >> M;
    cout << "Введите размеры матрицы B:" << endl;
    cout << "M = " << M << endl;
    cout << "N = ";
    cin >> N;
    int** A = new int*[K];
    for (int i = 0; i < K; i++)
    {
        A[i] = new int[M];
    }
    int** B = new int*[M];
    for (int i = 0; i < M; i++)
    {
        B[i] = new int[N];
    }
    int** C = new int*[K];
    for (int i = 0; i < K; i++)
    {
        C[i] = new int[N];
    }
    cout << "Введите матрицу A:" << endl;
    MatrixInput(A, K, M);
    cout << "Введите матрицу B:" << endl;
    MatrixInput(B, M, N);
    cout << "Произведение матриц:" << endl;
    for (int j = 0; j < K; j++)
    {
        for (int i = 0; i < N; i++)
        {
            sum = 0;
            for (int r = 0; r < M; r++)
            {
                sum += A[j][r] * B[r][i];
            }
            C[j][i] = sum;
            cout << C[j][i] << " ";
        }
        cout << endl;
    }
    for (int i = 0; i < K; i++)
    {
        delete [] A[i];
        delete [] C[i];
    }
    delete [] A;
    delete [] C;
    for (int i = 0; i < M; i++)
    {
        delete [] B[i];
    }
    delete [] B;
    system("pause");
    return 0;
}
1
13.09.2017, 19:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.09.2017, 19:21
Помогаю со студенческими работами здесь

Умножение матриц
Я юзаю Qt, но пишу сюда т.к. он никак не влияет на код (почти) У меня есть две матрицы A и B...

Умножение матриц
Ох уж этот универ... Короче, дела обстоят так: Перемножить матрицы А размером nхm и В размером...

Умножение матриц
Найти произведение k квадратных матриц А1*А2*...Аk. Процедура: вычисление произведения двух матриц.

Умножение матриц
Ошибка: не хочет умножать. c=c+a*b; int **mat(int n){ int **matrix; matrix=new int *;...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru