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

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

20.01.2013, 00:49. Показов 3101. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Реализовать алгоритм умножения двух матриц, заданных пользователем. Результат умножения записывается в третью матрицу.
http://ru.wikipedia.org/wiki/%... 0%B8%D1%86 тут описание как их умножать, не могу разобраться(
матрица должна быть двумерной, язык С++
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.01.2013, 00:49
Ответы с готовыми решениями:

На основе двух заданных матриц сформировать третью матрицу
Даны матрицы А(3х4) и С(3х4), элементы которых вычисляются по формулам: {a}_{ij}=\frac{i+j}{7.3(4i-2.5j)} ...

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

Турбопаскаль.Двумерные массивы.Из двух матриц составить третью предвариельно сортируя перед занесением в 3 матрицу.
Здравствуйте уважаемые господа разбирающиеся в паскале прошу вас помочь с программой над которой бьюсь уже несколько дней. Даны два...

19
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
20.01.2013, 01:20
В этой теме я приводил пример, как это сделать на С++.
1
2 / 2 / 0
Регистрация: 18.12.2012
Сообщений: 77
20.01.2013, 01:27  [ТС]
спасибо, но я там не могу разобратся,
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";
 
}
}
}
мне нужно сюда както вставить решение..
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
20.01.2013, 01:48
А где вторая матрица? Да и третья матрица под результат?
1
2 / 2 / 0
Регистрация: 18.12.2012
Сообщений: 77
20.01.2013, 02:31  [ТС]
блин протупил, не то взял, тут только одна матрица

Добавлено через 39 минут
кто может помочь?
пожалусто, не как не могу разобратся
0
 Аватар для SeaMonster
15 / 15 / 1
Регистрация: 31.12.2012
Сообщений: 101
20.01.2013, 02:51
Очень примитивный, но вроде работающий пример перемножения квадратных матриц. Только что написал и проверил по примеру перемножения матриц отсюда 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();
}
1
2 / 2 / 0
Регистрация: 18.12.2012
Сообщений: 77
20.01.2013, 03:18  [ТС]
а можешь по проще сделать, а то я так ещё не учил
0
 Аватар для SeaMonster
15 / 15 / 1
Регистрация: 31.12.2012
Сообщений: 101
20.01.2013, 03:25
? Что из этого сложно? вроде и так использую только самые простые возможности. Короче - выдели, что именно тут сложно и если сумею, то завтра напишу проще.
1
2 / 2 / 0
Регистрация: 18.12.2012
Сообщений: 77
20.01.2013, 03:36  [ТС]
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";
 
}
}
}
я такого вида учил
0
 Аватар для Евгений89
102 / 102 / 39
Регистрация: 17.04.2011
Сообщений: 554
20.01.2013, 12:22
вот тебе пример с квадратными матрицами
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();
 
}
0
2 / 2 / 0
Регистрация: 18.12.2012
Сообщений: 77
20.01.2013, 12:45  [ТС]
Цитата Сообщение от Евгений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();
 
}
тут ошибка(
0
 Аватар для Евгений89
102 / 102 / 39
Регистрация: 17.04.2011
Сообщений: 554
20.01.2013, 14:02
в каком месте.Что за ошибка. У меня все норм рпботает.Кидай сюда ошибку
0
2 / 2 / 0
Регистрация: 18.12.2012
Сообщений: 77
20.01.2013, 14:41  [ТС]
не подчеркнуто не где, а когда комптлирую, пишит что ошибка
0
Студент
 Аватар для MickeyBlueEyes
121 / 132 / 39
Регистрация: 07.04.2011
Сообщений: 503
20.01.2013, 14:44
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();
}
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
20.01.2013, 15:03
Цитата Сообщение от Евгений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;
    }
  }
0
Студент
 Аватар для MickeyBlueEyes
121 / 132 / 39
Регистрация: 07.04.2011
Сообщений: 503
20.01.2013, 15:26
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();
}
0
 Аватар для Евгений89
102 / 102 / 39
Регистрация: 17.04.2011
Сообщений: 554
20.01.2013, 16:03
Цитата Сообщение от VlaDdislav Посмотреть сообщение
не подчеркнуто не где, а когда комптлирую, пишит что ошибка
убери
C++
1
#include"stdafx.h"
0
0 / 0 / 0
Регистрация: 14.03.2013
Сообщений: 11
14.03.2013, 12:42
Здравствуйте, товарищи! Я столкнулся с той же задачей. Собственно, сам алгоритм реализован, и вроде бы всё работает, но программа вылетает на вводе следующих размеров матриц (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;
    }
}
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,532
Записей в блоге: 1
14.03.2013, 12:50
Цитата Сообщение от truestyle Посмотреть сообщение
и вроде бы всё работает, но программа вылетает на вводе следующих размеров матриц (6,5; 5,2), (5,6; 6,2), (5,2; 2,3).
я ничего не понял. Что конкретно вводишь? Какие размеры матриц?
0
0 / 0 / 0
Регистрация: 14.03.2013
Сообщений: 11
14.03.2013, 12:55
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
я ничего не понял. Что конкретно вводишь? Какие размеры матриц?
Размеры первой матрицы 6х5, размеры второй матрицы 5х2. Ну и остальное, то что в скобках написал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.03.2013, 12:55
Помогаю со студенческими работами здесь

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

Из двух матриц сформировать третью
Заданы две матрицы A и B размерности NxN. Сформировать из них прямоугольную матрицу X размером , включая в первые N столбцов матрицу A, в...

Из двух матриц сформировать третью
Даны две прямоугольные целочисленные матрицы А и В одинакового размера m x п. Создать матрицу того же размера, в которой элементы равны 1,...

На основе двух матриц создать третью
Построчно ввести матрицу целых чисел 5×5, вторую матрицу за-полнить случайными числами &lt; 100. Сформировать третью матрицу: каждый ее...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru