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

Функция перемножения матриц.

22.12.2010, 18:25. Показов 27927. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Функция mult, прошу помощи, ибо не пойму в чем ошибка.
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
#include <iostream>
#include <math.h>
#include <time.h>
#include <cstdlib>
using namespace std;
void shape(int** x, int n, int m, int** y, int** c);
void mult (int** x, int n, int m, int** y, int** mt);
int main ()
{
    int n;
    int m;
    cout <<"Enter the number of strings of matrix A"<<endl;
    cin >> n;
    cout <<"Enter the number of columns of matrix A"<<endl;
    cin >> m;
    srand(time(NULL));
    int **a = new int* [n];
    for (int i = 0; i < n; i++)
    {
        a[i] = new int [m];
    }
    cout <<"The array A is"<< endl;
    for (int i = 0; i< n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            a[i][j] = rand()% 10;
            cout << a[i][j]<<' ';
        }
        cout << endl;
    }
    // определили первую матрицу
    int z;
    int w;
    cout <<"Enter the number of strings of matrix B"<<endl;
    cin >> z;
    cout <<"Enter the number of columns of matrix B"<<endl;
    cin >> w;
    int **b = new int* [z];
    for (int i = 0; i < z; i++)
    {
        b[i] = new int [w];
    }
    cout <<"The array B is"<< endl;
    for (int i = 0; i< z; i++)
    {
        for (int j = 0; j < w; j++)
        {
            b[i][j] = rand()% 10;
            cout << b[i][j]<<' ';
        }
        cout << endl;
    }
    // определили вторую матрицу
    int l;
    int k;
    cout <<"Enter the number of strings of matrix C"<<endl;
    cin >> l;
    cout <<"Enter the number of columns of matrix C"<<endl;
    cin >> k;
    int **add = new int* [l];
    for (int i = 0; i < l; i++)
    {
        add[i] = new int [k];
    }
    for (int i = 0; i< l; i++)
    {
        for (int j = 0; j < k; j++)
        {
            add[i][j] = 0;
        }
        cout << endl;
    }
    if (n == z && m == w)
        shape (a, n, m, b, add);
    cout <<" The addition is" << endl;
    for (int i = 0; i< l; i++)
    {
        for (int j = 0; j < k; j++)
        {
            cout << add[i][j]<<' ';
        }
        cout << endl;
    }
    // матрица- заполнитель умножения
    int **mt = new int* [l];
    for (int i = 0; i < l; i++)
    {
        mt[i] = new int [k];
    }
    for (int i = 0; i< l; i++)
    {
        for (int j = 0; j < k; j++)
        {
            mt[i][j] = 0;
        }
        cout << endl;
    }
    if (m == z)
        mult(a, n, m, b, mt);
    else cout <<"Error in mult"<< endl;
    cout <<" The mult is is" << endl;
    for (int i = 0; i< l; i++)
    {
        for (int j = 0; j < k; j++)
        {
            cout << add[i][j]<<' ';
        }
        cout << endl;
    }
    system ("PAUSE");
    for(int i = 0; i < n; i++)
    delete[] a[i];
    delete[] a;
    for(int i = 0; i < z; i++)
    delete[] b[i];
    delete[] b;
    for(int i = 0; i < l; i++)
    delete[] add[i];
    delete[] add;
    for(int i = 0; i < l; i++)
    delete[] mt[i];
    delete[] mt;
    return 0;
}
void shape(int** x, int n, int m, int** y, int** add)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            add[i][j] = x[i][j] + y[i][j];
        }
    }
}
void mult(int** x, int n, int m, int** y, int** mt)
{
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            {
                mt[i][j] += x[i][i] * y[i][j];
            }
        }
    }
 
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.12.2010, 18:25
Ответы с готовыми решениями:

Функция перемножения матриц выдает неверный результат
int **mas_1; int **mas_2; int **mas_3;//глобальные void multiply(int row1, int col1, int row2, int col2) { if (row1 == col2) ...

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

Оптимизация перемножения матриц
В конечном итоге нужно получить результат не менее 2500 (самый последний вывод). Вот код: #include &quot;stdafx.h&quot; #include...

4
 Аватар для DAgot_
24 / 24 / 6
Регистрация: 03.01.2010
Сообщений: 68
22.12.2010, 18:43
Насколько я помню, матрицы перемножаются по правилу «строка на столбец».
И, если функция mult должна перемножать матрицы так, как я это понимаю, то вместо
C++
1
mt[i][j] += x[i][i] * y[i][j];
должно стоять
C++
1
mt[i][j] = x[j][i] * y[i][j];
1
 Аватар для Кемаль
0 / 0 / 1
Регистрация: 02.11.2010
Сообщений: 38
22.12.2010, 20:17  [ТС]
мы как бы каждый элемент строки, умножаем на каждый элемент столбца и их складываем, ( если число столбцов левой матрицы равно числу строк левой матрицы), а у меня умножается лишь по одному элементу.
0
 Аватар для DAgot_
24 / 24 / 6
Регистрация: 03.01.2010
Сообщений: 68
22.12.2010, 23:22
Точно, точно.
Тогда так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void mult(int** x, int n, int m, int** y, int** mt)
int temp = 0;
{
        for (int i = 0; i < n; i++)
        {
                for (int j = 0; j < m; j++)
                {
                        for(int k = 0; k < n; k++)
                        {
                                temp += x[j][k] * y[k][j];
                        }
                        mt[i][j] = temp;
                }
        }
 
}
0
 Аватар для Kostyanych77
173 / 12 / 4
Регистрация: 21.12.2010
Сообщений: 66
22.12.2010, 23:27
Ты просто много раз объявлял переменную "i", вот твойже код только обработанный:
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
#include <iostream>
#include <math.h>
#include <time.h>
#include <cstdlib>
using namespace std;
void shape(int** x, int n, int m, int** y, int** c);
void mult (int** x, int n, int m, int** y, int** mt);
int main ()
{
        int n;
        int m;
        cout <<"Enter the number of strings of matrix A"<<endl;
        cin >> n;
        cout <<"Enter the number of columns of matrix A"<<endl;
        cin >> m;
        srand(time(NULL));
        int **a = new int* [n];
        for (int i = 0; i < n; i++)
        {
                a[i] = new int [m];
        }
        cout <<"The array A is"<< endl;
        for (i = 0; i< n; i++)
        {
                for (int j = 0; j < m; j++)
                {
                        a[i][j] = rand()% 10;
                        cout << a[i][j]<<' ';
                }
                cout << endl;
        }
        // îïðåäåëèëè ïåðâóþ ìàòðèöó
        int z;
        int w;
        cout <<"Enter the number of strings of matrix B"<<endl;
        cin >> z;
        cout <<"Enter the number of columns of matrix B"<<endl;
        cin >> w;
        int **b = new int* [z];
        for (i = 0; i < z; i++)
        {
                b[i] = new int [w];
        }
        cout <<"The array B is"<< endl;
        for (i = 0; i< z; i++)
        {
                for (int j = 0; j < w; j++)
                {
                        b[i][j] = rand()% 10;
                        cout << b[i][j]<<' ';
                }
                cout << endl;
        }
        // îïðåäåëèëè âòîðóþ ìàòðèöó
        int l;
        int k;
        cout <<"Enter the number of strings of matrix C"<<endl;
        cin >> l;
        cout <<"Enter the number of columns of matrix C"<<endl;
        cin >> k;
        int **add = new int* [l];
        for (i = 0; i < l; i++)
        {
                add[i] = new int [k];
        }
        for (i = 0; i< l; i++)
        {
                for (int j = 0; j < k; j++)
                {
                        add[i][j] = 0;
                }
                cout << endl;
        }
        if (n == z && m == w)
                shape (a, n, m, b, add);
        cout <<" The addition is" << endl;
        for (i = 0; i< l; i++)
        {
                for (int j = 0; j < k; j++)
                {
                        cout << add[i][j]<<' ';
                }
                cout << endl;
        }
        // ìàòðèöà- çàïîëíèòåëü óìíîæåíèÿ
        int **mt = new int* [l];
        for (i = 0; i < l; i++)
        {
                mt[i] = new int [k];
        }
        for (i = 0; i< l; i++)
        {
                for (int j = 0; j < k; j++)
                {
                        mt[i][j] = 0;
                }
                cout << endl;
        }
        if (m == z)
                mult(a, n, m, b, mt);
        else cout <<"Error in mult"<< endl;
        cout <<" The mult is is" << endl;
        for (i = 0; i< l; i++)
        {
                for (int j = 0; j < k; j++)
                {
                        cout << add[i][j]<<' ';
                }
                cout << endl;
        }
        system ("PAUSE");
        for(i = 0; i < n; i++)
        delete[] a[i];
        delete[] a;
        for(i = 0; i < z; i++)
        delete[] b[i];
        delete[] b;
        for(i = 0; i < l; i++)
        delete[] add[i];
        delete[] add;
        for(i = 0; i < l; i++)
        delete[] mt[i];
        delete[] mt;
        return 0;
}
void shape(int** x, int n, int m, int** y, int** add)
{
        for (int i = 0; i < n; i++)
        {
                for (int j = 0; j < m; j++)
                {
                        add[i][j] = x[i][j] + y[i][j];
                }
        }
}
void mult(int** x, int n, int m, int** y, int** mt)
{
        for (int i = 0; i < n; i++)
        {
                for (int j = 0; j < m; j++)
                {
                        {
                                mt[i][j] += x[i][i] * y[i][j];
                        }
                }
        }
 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.12.2010, 23:27
Помогаю со студенческими работами здесь

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

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

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

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

Написать функцию перемножения матриц
Написать программу , которая вводит матрицу А,транспонирует ее , транспонированную перемножает на А и печатает результат. При написании...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru