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

Транспонирование матриц. Произведение транспонированных матриц

17.02.2014, 06:44. Показов 3837. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Найти матрицу С:

C=ATBTB;

A=https://www.cyberforum.ru/cgi-bin/latex.cgi?\begin{bmatrix}1\\ 1\\ 1\end{bmatrix}

B=https://www.cyberforum.ru/cgi-bin/latex.cgi?\begin{bmatrix}1 & 2 & 0 \\ 0 & 1 & 2\end{bmatrix}

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
#include <iostream> 
#include <math.h> 
#include <iomanip> 
#include <conio.h> 
using namespace std;
void main(void) 
{ 
//Ввод значений матриц A и B 
    int a[3][1]={{1},{1},{1}}; 
    int b[2][3]={{1,2,0},{0,1,2}}; 
int c[3][1]; 
int k=0;int i=0; int j=0; 
//Вывод матрицы A на экран 
cout<<"matrica A=\n"; 
   cout<<"\n"; 
 for(int j=0,i=0;i<3;i++) 
   { 
   for(j=0;j<1;j++)cout<<a[i][j]<<" "; 
   cout<<"\n\n"; 
      cout<<"\n"; cout<<endl;    } 
//Вывод матрицы B на экран 
   cout<<"matrica B=\n"; 
   cout<<"\n"; 
   for(int j=0,i=0;i<2;i++) 
   { 
   for(j=0;j<3;j++)cout<<b[i][j]<<" "; 
   cout<<"\n\n"; 
      cout<<"\n"; cout<<endl;   } 
//Вывод матрицы С на экран 
  //* cout<<"rezult C="<<"\n"; 
   //for(int i=0,j=0,ik=0,jk=0;i<3;i++) 
     //{ 
     //for(jk=0;jk<1;jk++)    { 
       //for(j=0;j<3;j++) 
//{  k+=b[i][j]*b[i][j]*a[j][jk];} 
 //c[i][jk]=k; 
   //cout<<c[i][jk]<<"\n\n"; 
 // k =0;       } 
//} 
   cout<<"\n"; 
getch();  
}
значение С в комментарий, т.к. не знаю, как вычислить..
Помогите, пожалуйста! Желательно с комментариями. Отблагодарю как смогу )

Добавлено через 20 часов 25 минут
UP^
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.02.2014, 06:44
Ответы с готовыми решениями:

Транспонирование матриц
//Функция транспонирования void transpr (int mas , int i, int j){ for (i=0; i&lt;=2; i++){ ...

Транспонирование матриц!
Данна матрица 3х6 необходимо ее транспониравать (в 6х3) подскажите функцию.

Транспонирование матриц на С++
Здравствуйте, с началом учебы начал вспоминать С++. И столкнулся с новой проблемой. Есть...

Транспонирование матриц
Здравствуйте, с началом учебы начал вспоминать С++. И столкнулся с новой проблемой. Есть...

21
Заблокирован
17.02.2014, 10:40 2
С чем трудности?
0
0 / 0 / 1
Регистрация: 19.03.2013
Сообщений: 37
17.02.2014, 10:47  [ТС] 3
Ev_Hyper, конкретно с переводом матриц А и В в транспонированные и нахождением С. Никак не могу разобраться, билиберда получается какая-то.
0
Заблокирован
17.02.2014, 11:16 4
теорию знаете?
0
0 / 0 / 1
Регистрация: 19.03.2013
Сообщений: 37
17.02.2014, 15:31  [ТС] 5
Ev_Hyper, теорию Алгебраическую?
Транспонированные матрицы - это, грубо говоря перевернутые матрицы. Например,
B=https://www.cyberforum.ru/cgi-bin/latex.cgi?\begin{bmatrix}1 & 2 & 0 \\ 0 & 1 & 2\end{bmatrix}
тогда BT=https://www.cyberforum.ru/cgi-bin/latex.cgi?\begin{bmatrix}1 & 0\\ 2 & 1\\ 0 & 2\end{bmatrix}

А теорию С++ знаю совсем немного... Сразу лезу в такие дебри, знаю.. Но это решение, вроде бы, основано на массивах, что есть - начало)
0
Заблокирован
18.02.2014, 13:26 6
Цитата Сообщение от Mustakilloff Посмотреть сообщение
Ev_Hyper, теорию Алгебраическую?
конечно алгебраическую

Хорошо, давайте разбираться. Могу предложить следующую схему:
1. Создаете еще два массива, в которых хранятся транспонированные матрицы. Для начала задайе их в коде, потом измените на программное нахождение

2. Разбейте умножение на два этапа - первую матр. на вторую, а потом итог на третью.
Для проверки правильности делайте вывод на каждом этапе.
0
0 / 0 / 1
Регистрация: 19.03.2013
Сообщений: 37
18.02.2014, 15:20  [ТС] 7
Цитата Сообщение от Ev_Hyper Посмотреть сообщение
конечно алгебраическую

Хорошо, давайте разбираться. Могу предложить следующую схему:
1. Создаете еще два массива, в которых хранятся транспонированные матрицы. Для начала задайе их в коде, потом измените на программное нахождение

2. Разбейте умножение на два этапа - первую матр. на вторую, а потом итог на третью.
Для проверки правильности делайте вывод на каждом этапе.
так в том то и дело) что конкретно процесс "переворота"(транспонирования) я записать не могу, т.к. не знаю как переворачивать массивы)..
да и с умножением тоже проблемы.

Могу вот так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int At[1][3]={1,1,1};
cout<<"matrica At=\n"; 
   cout<<"\n"; 
   for(int j=0,i=0;i<1;i++) 
   { 
   for(j=0;j<3;j++)cout<<a[i][j]<<" "; 
   cout<<"\n\n"; 
      cout<<"\n"; cout<<endl;    } 
int Bt[3][2]={{1,0},{2,1},{0,2};
cout<<"matrica B=\n"; 
   cout<<"\n"; 
   for(int j=0,i=0;i<3;i++) 
   { 
   for(j=0;j<2;j++)cout<<b[i][j]<<" "; 
   cout<<"\n\n"; 
      cout<<"\n"; cout<<endl;   }
Добавлено через 21 минуту
C++
1
2
3
4
5
int AtBt;
for (i=1;i<=3;i++) 
{   AtBt=0;  
     for (j=1;j<=2;j++)
AtBt=AtBt+At[i][j]*Bt[i][j];
0
0 / 0 / 1
Регистрация: 19.03.2013
Сообщений: 37
20.02.2014, 09:22  [ТС] 8
Состряпал что-то... Но не знаю где ошибки и в чём они заключаются.. Подправьте, пожалуйста, кто может:
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
#include <iostream> 
#include <math.h> 
#include <iomanip> 
#include <conio.h> 
using namespace std;
void main(void) 
{ int d[3][3];
//Ввод значений матриц A и B 
    int a[3][1]={{1},{1},{1}}; 
    int b[2][3]={{1,2,0},{0,1,2}}; 
int c[3][1]; 
int k=0;int i=0; int j=0; 
//Вывод матрицы A на экран 
cout<<"matrica A=\n"; 
   cout<<"\n"; 
 for(int j=0,i=0;i<3;i++) 
   { 
   for(j=0;j<1;j++)cout<<a[i][j]<<" "; 
   cout<<"\n\n"; 
      cout<<"\n"; cout<<endl;    } 
//Вывод матрицы B на экран 
   cout<<"matrica B=\n"; 
   cout<<"\n"; 
   for(int j=0,i=0;i<2;i++) 
   { 
   for(j=0;j<3;j++)cout<<b[i][j]<<" "; 
   cout<<"\n\n"; 
      cout<<"\n"; cout<<endl;   } 
   //транспонированные матрицы А и В
   int At[1][3]={1,1,1};
cout<<"matrica At=\n"; 
   cout<<"\n"; 
   for(int j=0,i=0;i<1;i++) 
   { 
   for(j=0;j<3;j++)cout<<a[i][j]<<" "; 
   cout<<"\n\n"; 
      cout<<"\n"; cout<<endl;    } 
   int Bt[3][2]={{1,0},{2,1},{0,2}};
cout<<"matrica B=\n"; 
   cout<<"\n"; 
   for(int j=0,i=0;i<3;i++) 
   { 
   for(j=0;j<2;j++)cout<<b[i][j]<<" "; 
   cout<<"\n\n"; 
      cout<<"\n"; cout<<endl;   }
   //умножение транспонированных матриц А и В
    int AtBt;
     for (i=1;i<=3;i++) 
     {   AtBt=0;  
     for (j=1;j<=2;j++)
     AtBt=AtBt+At[i][j]*Bt[i][j];
     cout<<"\n\n"; cout<<endl; }
 
     //умножение AtBt на B:
 
     int C,B[i][j];
     for (i=1,i<=3;i++;)
     { C=0;
     for (j=2;j<=3;j++;)
         C=C+AtBt[i][j]*B[i][j];
     cout<<"C=",C; }
 
   
getch();  
}
0
Заблокирован
20.02.2014, 09:38 9
Ошибки компиляции:

C++
1
2
3
4
5
int C,B[i][j];
...
for (j=2;j<=3;j++;)
...
for (i=1,i<=3;i++;)
Цитата Сообщение от Mustakilloff Посмотреть сообщение
C++
1
C=C+AtBt[i][j]*B[i][j];
AtBt - не массив

Цитата Сообщение от Mustakilloff Посмотреть сообщение
C++
1
int C,B[i][j];
что вы хотите видеть в массив B?
0
0 / 0 / 1
Регистрация: 19.03.2013
Сообщений: 37
20.02.2014, 13:31  [ТС] 10
что вы хотите видеть в массив B?
ну он ведь изначально был, почему теперь его нет?) вот я и вписал..)
C++
1
2
3
4
5
6
7
8
//Вывод матрицы B на экран 
   cout<<"matrica B=\n"; 
   cout<<"\n"; 
   for(int j=0,i=0;i<2;i++) 
   { 
   for(j=0;j<3;j++)cout<<b[i][j]<<" "; 
   cout<<"\n\n"; 
      cout<<"\n"; cout<<endl;   }
вот тут
0
0 / 0 / 1
Регистрация: 19.03.2013
Сообщений: 37
28.02.2014, 12:44  [ТС] 11
up^!

помогите..
0
Заблокирован
28.02.2014, 14:03 12
Mustakilloff, вы хотите разобраться или получить готовый код?
0
0 / 0 / 1
Регистрация: 19.03.2013
Сообщений: 37
05.03.2014, 13:44  [ТС] 13
Ev_Hyper, объясните, если можете, пожалуйста, как написать этот три проклятый код транспонирования матрицы..
и в умножении я так и не разобрался, ерунда получается..
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12460 / 7484 / 1754
Регистрация: 25.07.2009
Сообщений: 13,762
05.03.2014, 15:56 14
Mustakilloff, вот Вам простенький пример поворота матрицы:
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
#include <iostream>
 
int main() {
    const int X_DIMENSION = 3;
    const int Y_DIMENSION = 2; // размеры по горизонтали и вертикали
    
    int originMatrix[Y_DIMENSION][X_DIMENSION]; // оригинальная матрица
    int transportedMatrix[X_DIMENSION][Y_DIMENSION]; // транспортированная
    
    // заполним для наглядности оригинальную
    for ( int i = 0; i < Y_DIMENSION; ++i )
        for ( int j = 0; j < X_DIMENSION; ++j )
            originMatrix[i][j] = j + 1 + i * X_DIMENSION;
    
    // а теперь транспортированную
    for ( int i = 0; i < Y_DIMENSION; ++i )
        for ( int j = 0; j < X_DIMENSION; ++j )
            transportedMatrix[j][Y_DIMENSION - 1 - i] = originMatrix[i][j];
            
    // ну и выведем всё это безобразие
    std::cout << "Original:" << std::endl;
    for ( int i = 0; i < Y_DIMENSION; ++i ) {
        for ( int j = 0; j < X_DIMENSION; ++j )
            std::cout << originMatrix[i][j] << " ";
        std::cout << std::endl;
    }
    
    std::cout << "\nTransported:" << std::endl;
    for ( int i = 0; i < X_DIMENSION; ++i ) {
        for ( int j = 0; j < Y_DIMENSION; ++j )
            std::cout << transportedMatrix[i][j] << " ";
        std::cout << std::endl;
    }
    
    return 0;
}
Возьмите листок в клетку и на нём попробуйте матрицы порисовать, как там они поворачиваются, умножаются, etc... Так нагляднее.
1
0 / 0 / 1
Регистрация: 19.03.2013
Сообщений: 37
06.03.2014, 12:04  [ТС] 15
easybudda, а как в этом случае сделать заполнение матрицы не рандомным, а с клавиатуры?


а матрицы наглядно я поворачивал уже .. но мои слабенькие познания в С++ не позволяют перевести мой алгоритм в код.

Добавлено через 13 часов 21 минуту
Вот, вроде-бы разобрался... Ошибки в коде подправьте, пожалуйста. На мой взгляд, всё идеально
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
#include <stdio.h> 
#include <conio.h> 
#include <iostream> 
#include <iomanip> 
using namespace std;
void main(void) 
 
{// Определение переменных 
int 
a[3][3],b[3][3],c[3][3],aT[3][3],bT[3][3],i,j,m,n,m1,n1,f,l,o,max; 
cout<<"vvedite pa3Mep Matrici A:"<<endl; 
cin>>n; 
cin>>m; 
cout<<"vvedite pa3Mep Matrici B:"<<endl; 
cin>>n1; 
cin>>m1; 
// проверка размерности матриц 
if (n1>=m1) 
   { 
    max=n1; 
   } 
else 
  { 
   max=m1; 
   } 
if ((n==m)&(n==max)) 
     { // Заполнение матрицы А 
  cout<<"vvedite elementi Matrici A:"<<endl; 
     for (i=1;i<=n;i++) 
       { 
       for(j=1;j<=m;j++) 
       cin>>a[i][j]; 
         } 
    // Заполнение матрицы B 
    cout<<"vvedite elementi Matrici B:"<<endl; 
    for (i=1;i<=n1;i++) 
        { 
        for(j=1;j<=m1;j++) 
        cin>>b[i][j]; 
        }
    // транспонирование А
     for (i=1;i<=n;i++) 
           { 
           for(j=1;j<=m;j++) 
           {aT[j][i]=a[i][j];} 
           } 
     // транспонирование B
 
     for (i=1;i<=n1;i++) 
           { 
           for(j=1;j<=m1;j++) 
           {bT[j][i]=b[i][j];} 
           } 
 
     // умножение aT*bT
      for (i=1;i<=n;i++) 
           { 
           for(j=1;j<=n;j++) 
             { 
              f=0; 
              for (l=1;l<=m;l++) 
               { 
               f=f+aT[i][l]*bT[l][j]; 
               } 
             c[i][j]=f; 
             } 
            } 
 
       for (i=1;i<=n;i++) 
           { 
           for(j=1;j<=n;j++) 
             { 
              o=0; 
              for (l=1;l<=m;l++) 
               { 
               o=0+f[l][j]*b[i][j]; 
               } 
             c[i][j]=o; 
             } 
            } 
 
       // Вывод матрицы C  на экран 
cout<<"matrica C: \n"; 
cout<<endl; 
for (i=1;i<=n1;i++) 
      { 
       for(j=1;j<=n1;j++) 
       cout<<setw(n1)<<c[i][j]; 
        cout<<endl; 
       } 
   } 
 
getch(); 
}
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12460 / 7484 / 1754
Регистрация: 25.07.2009
Сообщений: 13,762
06.03.2014, 17:27 16
Цитата Сообщение от Mustakilloff Посмотреть сообщение
На мой взгляд, всё идеально
Вообще всё не так, как надо. Начиная с создания пяти квадратных матриц 3Х3, а потом получения как-бы их размеров, заканчивая циклами с пропуском первых элементов и выходом за границу массивов (индексы элементов в массиве начинаются с 0 и заканчиваются количеством элементов минус один). Ну и между делом - поворот точно неправильно сделан, в умножение не вчитывался, но думаю - и там засада...
0
0 / 0 / 1
Регистрация: 19.03.2013
Сообщений: 37
06.03.2014, 17:35  [ТС] 17
И снова Мамонтова оказала медвежью услугу...
Спасибо!) Попробую сделать так, как написали Вы если, конечно, расскажете, как сделать заполнение массива с клавиатуры..)

C++
1
2
3
4
 // заполним для наглядности оригинальную
    for ( int i = 0; i < Y_DIMENSION; ++i )
        for ( int j = 0; j < X_DIMENSION; ++j )
           cin << originMatrix[i][j]
так?)
0
51 / 51 / 21
Регистрация: 08.02.2013
Сообщений: 189
06.03.2014, 17:52 18
Цитата Сообщение от Mustakilloff Посмотреть сообщение
cin << originMatrix[i][j]
Так:
C++
1
cin >> originMatrix[i][j];
Вы считываете данные из входного потока в элемент массива.
1
0 / 0 / 1
Регистрация: 19.03.2013
Сообщений: 37
12.03.2014, 09:34  [ТС] 19
Сделал вот так, компилятор показал около 20 ошибок, вроде бы всё указывал.. Не пойму..
3.cpp(16): error C2057: требуется константное выражение
3.cpp(16): error C2466: невозможно выделить память для массива постоянного нулевого размера
3.cpp(16): error C2057: требуется константное выражение
3.cpp(16): error C2466: невозможно выделить память для массива постоянного нулевого размера
3.cpp(16): error C2087: A: отсутствует индекс
3.cpp(16): error C2133: A: неизвестный размер
3.cpp(22): error C2057: требуется константное выражение
3.cpp(22): error C2466: невозможно выделить память для массива постоянного нулевого размера
3.cpp(22): error C2057: требуется константное выражение
3.cpp(22): error C2466: невозможно выделить память для массива постоянного нулевого размера
3.cpp(22): error C2087: transA: отсутствует индекс
3.cpp(22): error C2133: transA: неизвестный размер
3.cpp(37): error C2065: B: необъявленный идентификатор
3.cpp(39): error C2057: требуется константное выражение
3.cpp(39): error C2466: невозможно выделить память для массива постоянного нулевого размера
3.cpp(39): error C2057: требуется константное выражение
3.cpp(39): error C2466: невозможно выделить память для массива постоянного нулевого размера
3.cpp(39): error C2087: transB: отсутствует индекс
3.cpp(39): error C2133: transB: неизвестный размер
3.cpp(42): error C2065: B: необъявленный идентификатор
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
#include <iostream>
#include <conio.h>
#include <iomanip>
#include <stdio.h>
 
using namespace std;
int main() {
                setlocale(LC_ALL, "Russian"); 
 
int x_a, x_b, y_a, y_b, f, p, o, l, k;
cout<<"/n Введите ширину матрицы А";
cin>>x_a;
cout<<"/n Введите высоту матрицы А";
cin>>y_a;
int A[x_a][y_a];
 cout<<"/n Введите матрицу А";
 for ( int i = 0; i < x_a; ++i )
        for ( int j = 0; j < y_a; ++j )
           cin >> A[i][j];
 //транспонирование матрицы А
 int transA[y_a][x_a];
 for ( int i = 0; i < x_a; ++i )
        for ( int j = 0; j < y_a; ++j )
            transA[j][x_a - 1 - i] = A[i][j];
 
 
 
cout<<"/n Введите ширину матрицы B";
cin>>x_b;
cout<<"/n Введите высоту матрицы B";
cin>>y_b;
 
 cout<<"/n Введите матрицу B";
 for ( int i = 0; i < x_b; ++i )
        for ( int j = 0; j < y_b; ++j )
           cin >> B[i][j];
 //транспонирование матрицы B
 int transB[y_b][x_b];
 for ( int i = 0; i < x_b; ++i )
        for ( int j = 0; j < y_b; ++j )
            transB[j][x_b - 1 - i] = B[i][j];
 
 
 cout << "A:" << endl;
    for ( int i = 0; i < x_a; ++i ) {
        for ( int j = 0; j < y_a; ++j )
            cout << A[i][j] << " ";
        cout << endl;
    }
        cout << "transA:" << endl;
    for ( int i = 0; i < y_a; ++i ) {
        for ( int j = 0; j < x_a; ++j )
            cout << transA[i][j] << " ";
        cout << endl;
    }
 
system("pause");
return 0;
}
Хелп! В чем же я не прав!?
0
Заблокирован
12.03.2014, 09:53 20
Mustakilloff, почитайте про динамические массивы. Но для начала лучше сделайте их статическими:
C++
1
int A[20][20], B[20][20];
0
12.03.2014, 09:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.03.2014, 09:53
Помогаю со студенческими работами здесь

Матрицы в TC.Транспонирование матриц
Написать программу выполняющую операцию А^t+5B-3C. Полученную матрицу вывести на экран. Ввод...

Транспонирование прямоугольных матриц
в данном случае не транспонируются матрицы размерами 3x2 и аналогичные(где строк больше чем...

Умножение, сложение и транспонирование матриц
помогите написать программу на языке с++ которая выполняет умножение, сложение и транспонирование...

Транспонирование матриц(у меня не стандартный случай)
Не могу разобраться с одной проблемой: Это набор функций, для работы с матрицей...


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

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