0 / 0 / 0
Регистрация: 21.10.2020
Сообщений: 3
1

Произведение двух двумерных неквадратных матриц. Код написан, но имеется ошибка

27.10.2020, 17:29. Показов 457. Ответов 1

Я написал код для вычисления произведения двух матриц, но в результате после произведения матриц все элементы матрицы result равны между собой. Не могу понять, почему так выходит

Код C++:

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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include <iostream>
#include <cmath>
#include <algorithm>
#include <ctime>
 
using namespace std;
 
void Array(int** arr, int** arr2, int** result, int n, int m, int n1, int m1)
{
    for (int i = 0; i < n; i++)
    {
        *(arr  + i) = new int[m];
    }
 
    for (int i = 0; i < n1; i++)
    {
        *(arr2 + i) = new int[m1];
    }
    for (int i = 0; i < n; i++)
    {
        *(result + i) = new int[m1];
    }
}
 
void fillArray(int** arr, int** arr2, int n, int m, int n1, int m1)
{
    for (int i = 0; i < n; i++) 
    {
        for (int j = 0; j < m; j++)
        {
            arr[i][j] = rand() % 50 - 25;
        }
    }
 
    for (int i = 0; i < n1; i++)
    {
        for (int j = 0; j < m1; j++)
        {
            arr2[i][j] = rand() % 50 - 25;
        }
    }
 
}
 
void showArray(int** arr, int** arr2, int n, int m, int n1, int m1)
{
    cout << "Первый массив: " << endl;
    cout << endl;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }
 
    cout << endl;
    cout << "Второй массив: " << endl;
    cout << endl;
    for (int i = 0; i < n1; i++)
    {
        for (int j = 0; j < m1; j++)
        {
            cout << arr2[i][j] << " ";
        }
        cout << endl;
    }
    cout << endl;
}
 
bool Check(int** arr, int** arr2, int n, int m, int n1, int m1)
{
    if (n != n1 || m != m1)
    {
        cout << "Произведение матриц не может быть вычислено, так как кол-во строк и столбцов массивов не совпадают" << endl;
        return true;
    }
    else
    {
        return false;
    }
}
 
void function(int** arr, int** arr2, int** result, int n, int m, int n1, int m1)
{
    for (int r1 = 0; r1 < n; r1++) 
    {
        for (int r2 = 0; r2 < m1; r2++) 
        {
            result[r1][r2] = 0;
            for (int i = 0; i < n; i++)
            {
                for (int j = 0; j < m; j++)
                {
                    for (int i1 = 0; i1 < n1; i1++)
                    {
                        for (int j1 = 0; j1 < m1; j1++)
                        {
                            result[r1][r2] = arr[i][j] * arr2[i1][j1];
                        }
                    }
                }
            }
        }
    }
}
 
void Result(int** result, int n, int m1)
{
    cout << "Результат уменожения массивов: " << endl;
    cout << endl;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m1; j++)
        {
            cout << result[i][j] << " ";
        }
        cout << endl;
    }
    cout << endl;
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    srand(time(0));
    int n = 0;
    int m = 0;
    int n1 = 0;
    int m1 = 0;
 
    cout << "Введите кол-во строк первого массива " << endl;
    cin >> n;
    cout << "Введите кол-во столбцов первого массива " << endl;
    cin >> m;
 
    cout << "Введите кол-во строк второго массива " << endl;
    cin >> n1;
    cout << "Введите кол-во столбцов второго массива " << endl;
    cin >> m1;
 
    int** arr = new int*[n];
    int** arr2 = new int* [n1];
    int** result = new int* [n];
 
    cout << endl;
    cout << endl;
 
    Array(arr, arr2, result, n, m, n1, m1);
    fillArray(arr, arr2, n, m, n1, m1);
    showArray(arr, arr2, n, m, n1, m1);
    if (Check(arr, arr2, n, m, n1, m1))
    {
        return 0;
    }
    function(arr, arr2, result, n, m, n1, m1);
    Result(result, n, m1);
    
}
Скриншот результата:

Произведение двух двумерных неквадратных матриц. Код написан, но имеется ошибка
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.10.2020, 17:29
Ответы с готовыми решениями:

Расчет суммы двух неквадратных матриц
Помогите, пожалуйста Дали задание: Написать программу, выполняющую расчет суммы двух...

Умножение НЕквадратных матриц (не работает код)
1) делал умножение матриц, где число строк и столбцов одинаковое кол-во, работает, но только с...

Написать программу, выполняющую расчет произведения двух неквадратных матриц
Написать программу, выполняющую расчет произведения двух неквадратных матриц. Матрицы должны...

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

1
6565 / 4550 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
27.10.2020, 19:40 2
Цитата Сообщение от pihta27 Посмотреть сообщение
Я написал код для вычисления произведения двух матриц, но в результате после произведения матриц все элементы матрицы result равны между собой. Не могу понять, почему так выходит
Цитата Сообщение от pihta27 Посмотреть сообщение
for (int i1 = 0; i1 < n1; i1++)
                    {
                        for (int j1 = 0; j1 < m1; j1++)
                        {
                            result[r1][r2] = arr[i][j] * arr2[i1][j1];
                        }
                    }
Здесь ты присваиваешь одному result[r1][r2] результат умножения каждой ячейки обеих матриц, по-очереди. Сохраняется последний, в твоём случае - 3 * 25.
У тебя вложенные циклы сделаны неправильно

Добавлено через 2 минуты
Цитата Сообщение от pihta27 Посмотреть сообщение
for (int r1 = 0; r1 < n; r1++)
    {
        for (int r2 = 0; r2 < m1; r2++)
Вот эти два не нужны. Там надо увеличивать r1 и r2 внутри других циклов
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.10.2020, 19:40
Помогаю со студенческими работами здесь

Умножение матриц (не работает для неквадратных матриц)
Доброго времени суток. Написал код для перемножения двух матриц. При вводе квадратной матрицы всё...

Матрицы: сложения двух матриц (двумерных массивов)
Необходимо написать программу сложения двух матриц (двумерных массивов) на языке СИ++. Даны...

Сравнение двумерных матриц - разобрать код
Разобрать суть кода, что в нем описанно, функций int** create_matrix(int n, int m,int tip) { ...

Умножение неквадратных матриц
Проблема только в том, что квадратные матрицы умножает неправильно, а с не квадратными вообще...

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

Умножение неквадратных матриц
Здравствуйте. Столкнулась с segmentation fault (core dumped) при умножении матриц. Сами они...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru