Форум программистов, компьютерный форум CyberForum.ru

Умножение двух матриц, ответ записывается в третью матрицу - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
VlaDdislav
2 / 2 / 0
Регистрация: 18.12.2012
Сообщений: 77
20.01.2013, 00:49     Умножение двух матриц, ответ записывается в третью матрицу #1
Реализовать алгоритм умножения двух матриц, заданных пользователем. Результат умножения записывается в третью матрицу.
http://ru.wikipedia.org/wiki/%D0%A3%...80%D0%B8%D1%86 тут описание как их умножать, не могу разобраться(
матрица должна быть двумерной, язык С++
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2013, 00:49     Умножение двух матриц, ответ записывается в третью матрицу
Посмотрите здесь:

Запись из 2-ух матриц в третью. C++
Умножение двух матриц 1000х1000 C++
C++ Умножение двух матриц на С++
Умножение двух матриц C++
Исправить ошибку (умножение двух матриц) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
20.01.2013, 01:20     Умножение двух матриц, ответ записывается в третью матрицу #2
В этой теме я приводил пример, как это сделать на С++.
VlaDdislav
2 / 2 / 0
Регистрация: 18.12.2012
Сообщений: 77
20.01.2013, 01:27  [ТС]     Умножение двух матриц, ответ записывается в третью матрицу #3
спасибо, но я там не могу разобратся,
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
#include <iostream>
#include <windows.h>
using namespace std;
void main()
{
SetConsoleOutputCP(1251);
const int Y = 3, X = 4;
int a[Y][X] = {0};
 
cout << "Запоните мaссив:\n";
for(int i = 0; i < Y; i++)
{
for(int j = 0; j < X; j++)
{
cout << "a[" << i << "][" << j << "] = ";
cin >> a[i][j];
}
}
cout << "Результат:\n";
for(int i = 0; i < Y; i++)
{
 
cout << i << ":\t"; 
 
for(int j = 0; j < X; j++)
{
cout << a[j][i] << "\t";
 
}
}
}
мне нужно сюда както вставить решение..
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
20.01.2013, 01:48     Умножение двух матриц, ответ записывается в третью матрицу #4
А где вторая матрица? Да и третья матрица под результат?
VlaDdislav
2 / 2 / 0
Регистрация: 18.12.2012
Сообщений: 77
20.01.2013, 02:31  [ТС]     Умножение двух матриц, ответ записывается в третью матрицу #5
блин протупил, не то взял, тут только одна матрица

Добавлено через 39 минут
кто может помочь?
пожалусто, не как не могу разобратся
SeaMonster
 Аватар для SeaMonster
15 / 15 / 0
Регистрация: 31.12.2012
Сообщений: 101
20.01.2013, 02:51     Умножение двух матриц, ответ записывается в третью матрицу #6
Очень примитивный, но вроде работающий пример перемножения квадратных матриц. Только что написал и проверил по примеру перемножения матриц отсюда http://lekprim.ru/fundifu/diffuru9.htm

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
#include<stdio.h>
#include<math.h>
#include<conio.h>
 
int main(){
 const int n=2;
 double A[n][n],B[n][n],C[n][n];
 int i,j,r;
for(i=0;i<n;i++) {for(j=0;j<n;j++){A[i][j]=0;B[i][j]=0;}} ///Заполняем исходные матрицы нулями
 
////A[0][0]=2;A[1][1]=2;B[0][0]=0.5;B[1][1]=0.5; ///Вводим кое-какие значения. По идее перемножение такого должно дать единичную матрицу
A[0][0]=1;A[0][1]=2;
A[1][0]=3;A[1][1]=4;
B[0][0]=5;B[0][1]=6;
B[1][0]=7;B[1][1]=8;
 
 
for(i=0;i<n;i++) {for(j=0;j<n;j++){int rez=0; for(r=0;r<n;r++){rez+=A[i][r]*B[r][j];}C[i][j]=rez;}}
printf("\n\n Matrix A:");
for(i=0;i<n;i++){printf("\n");for(j=0;j<n;j++){
   printf("\t %.2f",A[i][j]);
 }
}
 
printf("\n\n Matrix B:");
for(i=0;i<n;i++){printf("\n");for(j=0;j<n;j++){
   printf("\t %.2f",B[i][j]);
 }
}
 
printf("\n\n Matrix C:");
for(i=0;i<n;i++){printf("\n");for(j=0;j<n;j++){
   printf("\t %.2f",C[i][j]);
 }
}
 
getch();
}
VlaDdislav
2 / 2 / 0
Регистрация: 18.12.2012
Сообщений: 77
20.01.2013, 03:18  [ТС]     Умножение двух матриц, ответ записывается в третью матрицу #7
а можешь по проще сделать, а то я так ещё не учил
SeaMonster
 Аватар для SeaMonster
15 / 15 / 0
Регистрация: 31.12.2012
Сообщений: 101
20.01.2013, 03:25     Умножение двух матриц, ответ записывается в третью матрицу #8
? Что из этого сложно? вроде и так использую только самые простые возможности. Короче - выдели, что именно тут сложно и если сумею, то завтра напишу проще.
VlaDdislav
2 / 2 / 0
Регистрация: 18.12.2012
Сообщений: 77
20.01.2013, 03:36  [ТС]     Умножение двух матриц, ответ записывается в третью матрицу #9
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
#include <iostream>
#include <windows.h>
using namespace std;
void main()
{
SetConsoleOutputCP(1251);
const int Y = 3, X = 4;
int a[Y][X] = {0};
 
cout << "Запоните мaссив:\n";
for(int i = 0; i < Y; i++)
{
for(int j = 0; j < X; j++)
{
cout << "a[" << i << "][" << j << "] = ";
cin >> a[i][j];
}
}
cout << "Результат:\n";
for(int i = 0; i < Y; i++)
{
 
cout << i << ":\t"; 
 
for(int j = 0; j < X; j++)
{
cout << a[j][i] << "\t";
 
}
}
}
я такого вида учил
Евгений89
 Аватар для Евгений89
99 / 99 / 9
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
20.01.2013, 12:22     Умножение двух матриц, ответ записывается в третью матрицу #10
вот тебе пример с квадратными матрицами
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
// Умножение квадратных матриц.cpp: главный файл проекта.
 
#include "stdafx.h"
#include <iostream>
#include <conio.h>
 
using namespace std;
 
int main()
{ //размер матриц
    const int N=3;
    //индексные переменные
    int i,j,k;
    //первая матрица
    double A[N][N];
    //вторая матрица
    double B[N][N];
    //Третья матрица
    double C[N][N];
    //Ввод (построчный) первой матрицы
    cout<<"Matrix A: \n";
    for(i=0;i<N;i++)
        for(j=0;j<N;j++)
            cin>>A[i][j];
    //Ввод (построчный) 2 матрицы
    cout<<"Matrix B: \n";
    for(i=0;i<N;i++)
        for(j=0;j<N;j++)
            cin>>B[i][j];
    //Вычисление произведений матриц
    cout<<"Matrix C=AB: \n";
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
        {
            C[i][j]=0;
    for(k=0;k<N;k++)
        C[i][j]+=A[i][k]*B[k][j];
    //Вывод значения
    cout<<C[i][j]<<" ";
        }
        cout<<endl;
    }
    getch();
 
}
VlaDdislav
2 / 2 / 0
Регистрация: 18.12.2012
Сообщений: 77
20.01.2013, 12:45  [ТС]     Умножение двух матриц, ответ записывается в третью матрицу #11
Цитата Сообщение от Евгений89 Посмотреть сообщение
вот тебе пример с квадратными матрицами
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
// Умножение квадратных матриц.cpp: главный файл проекта.
 
#include "stdafx.h"
#include <iostream>
#include <conio.h>
 
using namespace std;
 
int main()
{ //размер матриц
    const int N=3;
    //индексные переменные
    int i,j,k;
    //первая матрица
    double A[N][N];
    //вторая матрица
    double B[N][N];
    //Третья матрица
    double C[N][N];
    //Ввод (построчный) первой матрицы
    cout<<"Matrix A: \n";
    for(i=0;i<N;i++)
        for(j=0;j<N;j++)
            cin>>A[i][j];
    //Ввод (построчный) 2 матрицы
    cout<<"Matrix B: \n";
    for(i=0;i<N;i++)
        for(j=0;j<N;j++)
            cin>>B[i][j];
    //Вычисление произведений матриц
    cout<<"Matrix C=AB: \n";
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
        {
            C[i][j]=0;
    for(k=0;k<N;k++)
        C[i][j]+=A[i][k]*B[k][j];
    //Вывод значения
    cout<<C[i][j]<<" ";
        }
        cout<<endl;
    }
    getch();
 
}
тут ошибка(
Евгений89
 Аватар для Евгений89
99 / 99 / 9
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
20.01.2013, 14:02     Умножение двух матриц, ответ записывается в третью матрицу #12
в каком месте.Что за ошибка. У меня все норм рпботает.Кидай сюда ошибку
VlaDdislav
2 / 2 / 0
Регистрация: 18.12.2012
Сообщений: 77
20.01.2013, 14:41  [ТС]     Умножение двух матриц, ответ записывается в третью матрицу #13
не подчеркнуто не где, а когда комптлирую, пишит что ошибка
MickeyBlueEyes
Студент
 Аватар для MickeyBlueEyes
120 / 131 / 12
Регистрация: 07.04.2011
Сообщений: 503
20.01.2013, 14:44     Умножение двух матриц, ответ записывается в третью матрицу #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
#include "stdafx.h"
#include <iostream>
using namespace std;
 
void main(int argc, char ** argv){
 
    const int S = 2;
 
    double M1[S][S], M2[S][S], M3[S][S];
 
    cout << " * M1 *" << endl << endl;
 
    for(int i = 0; i < S; i++){
        for(int k = 0; k < S; k++){
            cout << "M1[" << i << "][" << k << "] = ";
            cin >> M1[i][k];
        }
    }
 
    cout << endl << " * M2 *" << endl << endl;
    for(int i = 0; i < S; i++){
        for(int k = 0; k < S; k++){
            cout << "M2[" << i << "][" << k << "] = ";
            cin >> M2[i][k];
        }
    }
 
    cout << endl << " * Result *" << endl << endl;
    cout << "[";
    
    for(int i = 0; i < S; i++){
        
        if(i > 0) cout << " ";
        
        for(int k = 0; k < S; k++){
            
            M3[i][k] = M1[i][k] * M2[i][k];
 
            if((S - 1) == k && (S - 1) == i)
                cout << M3[i][k] << "]";
            else
                cout << M3[i][k] << ", ";
 
        }
        cout << endl;
    }
    
    getchar();
    
    getchar();
}
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
20.01.2013, 15:03     Умножение двух матриц, ответ записывается в третью матрицу #15
Цитата Сообщение от Евгений89 Посмотреть сообщение
в каком месте.Что за ошибка. У меня все норм рпботает.Кидай сюда ошибку
Хрустальный шар показывает, что у ТС компилятор не от Microsoft, поэтому "stdafx.h" у него отсутствует. Отсюда и ошибка компиляции.

Добавлено через 2 минуты
Цитата Сообщение от VlaDdislav Посмотреть сообщение
а можешь по проще сделать, а то я так ещё не учил
Дружище, проще уже только на счетах считать. А как ты учил умножать?

Цитата Сообщение от SeaMonster Посмотреть сообщение
? Что из этого сложно? вроде и так использую только самые простые возможности. Короче - выдели, что именно тут сложно и если сумею, то завтра напишу проще.
Это такой способ выяснить, насколько просто написано, не вникая в то, что именно написано.

Добавлено через 2 минуты
SeaMonster, старайтесь не писать много операторов в одну строку. Сильно ухудшает читаемость.
C++
1
2
3
4
5
6
7
8
9
10
  
  for (i = 0; i < n; ++i) {
    for (j = 0; j < n; ++j) {
      int rez=0;
      for(r=0;r<n;r++) {
        rez+=A[i][r]*B[r][j];
      }
      C[i][j]=rez;
    }
  }
MickeyBlueEyes
Студент
 Аватар для MickeyBlueEyes
120 / 131 / 12
Регистрация: 07.04.2011
Сообщений: 503
20.01.2013, 15:26     Умножение двух матриц, ответ записывается в третью матрицу #16
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
#include "stdafx.h"
#include <iostream>
using namespace std;
 
void main(int argc, char ** argv){
 
    const int S = 2;
 
    double M1[S][S], M2[S][S], M3[S][S] = {0};
 
    cout << " * M1 *" << endl << endl;
 
    for(int i = 0; i < S; i++){
        for(int k = 0; k < S; k++){
            cout << "M1[" << i << "][" << k << "] = ";
            cin >> M1[i][k];
        }
    }
 
    cout << endl << " * M2 *" << endl << endl;
    for(int i = 0; i < S; i++){
        for(int k = 0; k < S; k++){
            cout << "M2[" << i << "][" << k << "] = ";
            cin >> M2[i][k];
        }
    }
 
    cout << endl << " * Result *" << endl << endl;
    cout << "[";
    
    for(int i = 0; i < S; i++){
        
        if(i > 0) cout << " ";
        
        for(int k = 0; k < S; k++){
 
            for(int j = 0; j < S; j++) {
                M3[i][k] +=  M1[i][j] * M2[j][k];
            }
            
            if(i == (S - 1) && k == (S - 1))
                cout << M3[i][k] << "]";
            else
                cout << M3[i][k] << ", ";
            
        }
 
        cout << endl;
    }
    
    getchar();
    
    getchar();
}
Евгений89
 Аватар для Евгений89
99 / 99 / 9
Регистрация: 17.04.2011
Сообщений: 554
Завершенные тесты: 2
20.01.2013, 16:03     Умножение двух матриц, ответ записывается в третью матрицу #17
Цитата Сообщение от VlaDdislav Посмотреть сообщение
не подчеркнуто не где, а когда комптлирую, пишит что ошибка
убери
C++
1
#include"stdafx.h"
truestyle
0 / 0 / 0
Регистрация: 14.03.2013
Сообщений: 11
14.03.2013, 12:42     Умножение двух матриц, ответ записывается в третью матрицу #18
Здравствуйте, товарищи! Я столкнулся с той же задачей. Собственно, сам алгоритм реализован, и вроде бы всё работает, но программа вылетает на вводе следующих размеров матриц (6,5; 5,2), (5,6; 6,2), (5,2; 2,3). Возможно ещё есть какие-то значения. Причем в режиме дебага всё хорошо работает. Среда разработки - Codeblocks 12.11. Компилятор MinGW. Помогите, пожалуйста, разобраться в чём дело. Вот код...

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
#include <iostream>
#include <stdlib.h>
#include <time.h>
 
using namespace std;
 
int output(int *a, int ai, int aj); //Вывод массива
 
int gen(int *a, int ai, int aj);    //Генерация массива
 
int prod(int *a, int ai, int aj, int *b, int bi, int bj, int *c);  //Перемножение матриц a и b
 
int main()
{
    int **t, **r, **c;      /*Массивы*/
    int xt, yt, xr, yr;     /*Их размеры*/
 
    cout <<"Input sizes for first matrix" <<endl;
    cin >> xt >> yt;
 
     if ( (xt <= 0) || (yt <= 0) )
     {
         cout <<"Incorrect size of matrix" << endl;
         exit(-1);
     }
 
    cout <<"Input sizes for second matrix" <<endl;
    cin >> xr >> yr;
 
    if ( (xr <= 0) || (yr <= 0) )
    {
         cout <<"Incorrect size of matrix" << endl;
         exit(-1);
    }
 
 
    t = new int*[xt];
 
    for (int j=0; j<xt; j++)
     t[j] = new int[yt];
 
    r = new int*[xr];
 
    for (int j=0; j<xr; j++)
     r[j] = new int[yr];
 
    c = new int*[xt];
 
    for (int j=0; j<xt; j++)
    c[j] = new int[yr];
 
     srand(time(NULL));
 
    gen(&t[0][0], xt, yt);
    gen(&r[0][0], xr, yr);
 
    cout << "First matrix" <<endl;
    output(&t[0][0], xt, yt);
    cout<<endl;
 
    cout << "Second matrix" <<endl;
    output(&r[0][0], xr, yr);
    cout<<endl<<endl;
 
    if (prod(&t[0][0], xt, yt, &r[0][0], xr, yr, &c[0][0]) == -1)
    {
        cout << "Incorrect size of matrix for product" <<endl;
        exit(-1);
    }
 
    output(&c[0][0], xt, yr);
 
    return 0;
}
 
int output(int *a, int ai, int aj)
{
        int i,j;
 
        for(i=0; i<ai; i++)
        {
            for (j=0; j<aj; j++)
            {
                cout<< *(a + aj*i + j) << "\t";
            }
 
            cout<<endl;
        }
        return 1;
}
 
int gen(int *a, int ai, int aj)
{
 
    if ( (ai <= 0) || (aj <= 0) )
    {
        cout<<"Incorrect size of matrix"<<endl;
        exit(0);
    }
 
    else
    {
        int i,j;
 
        for(i=0; i<ai; i++)
        {
            for (j=0; j<aj; j++)
            {
                *(a + aj*i + j) = rand()%10;
            }
        }
 
        return 1;
    }
}
 
int prod(int *a, int ai, int aj, int *b, int bi, int bj, int* c)
{
    if (aj != bi) return -1;
 
    else
    {
        cout <<"Product of 2 matrix" <<endl;
 
        int s=0;
 
        for (int i=0; i<ai; i++)
        {
            for (int j=0; j<bj; j++)
            {
                s=0;
 
                for (int k=0; k<aj; k++)
                {
                    s = s + (*(a + i*aj + k)) * (*(b + bj*k + j));
                }
 
                *(c + bj*i + j) = s;
            }
        }
 
        return 1;
    }
}
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
14.03.2013, 12:50     Умножение двух матриц, ответ записывается в третью матрицу #19
Цитата Сообщение от truestyle Посмотреть сообщение
и вроде бы всё работает, но программа вылетает на вводе следующих размеров матриц (6,5; 5,2), (5,6; 6,2), (5,2; 2,3).
я ничего не понял. Что конкретно вводишь? Какие размеры матриц?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2013, 12:55     Умножение двух матриц, ответ записывается в третью матрицу
Еще ссылки по теме:

Умножение двух матриц C++
C++ Умножение двух матриц
C++ Умножение матриц

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

Или воспользуйтесь поиском по форуму:
truestyle
0 / 0 / 0
Регистрация: 14.03.2013
Сообщений: 11
14.03.2013, 12:55     Умножение двух матриц, ответ записывается в третью матрицу #20
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
я ничего не понял. Что конкретно вводишь? Какие размеры матриц?
Размеры первой матрицы 6х5, размеры второй матрицы 5х2. Ну и остальное, то что в скобках написал.
Yandex
Объявления
14.03.2013, 12:55     Умножение двух матриц, ответ записывается в третью матрицу
Ответ Создать тему
Опции темы

Текущее время: 21:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru