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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
Mustakilloff
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 37
#1

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

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

Найти матрицу С:

C=ATBTB;

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

B=http://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^
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2014, 06:44     Транспонирование матриц. Произведение транспонированных матриц
Посмотрите здесь:
C++ Транспонирование матриц!
Транспонирование матриц C++
Матрицы в TC.Транспонирование матриц C++
Транспонирование прямоугольных матриц C++
Умножение, сложение и транспонирование матриц C++
Транспонирование матриц(у меня не стандартный случай) C++
C++ Транспонирование, умножение и вычитание матриц, отчет в Mathcad
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ev_Hyper
Заблокирован
17.02.2014, 10:40     Транспонирование матриц. Произведение транспонированных матриц #2
С чем трудности?
Mustakilloff
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 37
17.02.2014, 10:47  [ТС]     Транспонирование матриц. Произведение транспонированных матриц #3
Ev_Hyper, конкретно с переводом матриц А и В в транспонированные и нахождением С. Никак не могу разобраться, билиберда получается какая-то.
Ev_Hyper
Заблокирован
17.02.2014, 11:16     Транспонирование матриц. Произведение транспонированных матриц #4
теорию знаете?
Mustakilloff
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 37
17.02.2014, 15:31  [ТС]     Транспонирование матриц. Произведение транспонированных матриц #5
Ev_Hyper, теорию Алгебраическую?
Транспонированные матрицы - это, грубо говоря перевернутые матрицы. Например,
B=http://www.cyberforum.ru/cgi-bin/latex.cgi?\begin{bmatrix}1 & 2 & 0 \\ 0 & 1 & 2\end{bmatrix}
тогда BT=http://www.cyberforum.ru/cgi-bin/latex.cgi?\begin{bmatrix}1 & 0\\ 2 & 1\\ 0 & 2\end{bmatrix}

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

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

2. Разбейте умножение на два этапа - первую матр. на вторую, а потом итог на третью.
Для проверки правильности делайте вывод на каждом этапе.
Mustakilloff
0 / 0 / 0
Регистрация: 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];
Mustakilloff
0 / 0 / 0
Регистрация: 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();  
}
Ev_Hyper
Заблокирован
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?
Mustakilloff
0 / 0 / 0
Регистрация: 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;   }
вот тут
Mustakilloff
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 37
28.02.2014, 12:44  [ТС]     Транспонирование матриц. Произведение транспонированных матриц #11
up^!

помогите..
Ev_Hyper
Заблокирован
28.02.2014, 14:03     Транспонирование матриц. Произведение транспонированных матриц #12
Mustakilloff, вы хотите разобраться или получить готовый код?
Mustakilloff
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 37
05.03.2014, 13:44  [ТС]     Транспонирование матриц. Произведение транспонированных матриц #13
Ev_Hyper, объясните, если можете, пожалуйста, как написать этот три проклятый код транспонирования матрицы..
и в умножении я так и не разобрался, ерунда получается..
easybudda
Эксперт CЭксперт С++
9470 / 5483 / 927
Регистрация: 25.07.2009
Сообщений: 10,506
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... Так нагляднее.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.03.2014, 12:04     Транспонирование матриц. Произведение транспонированных матриц
Еще ссылки по теме:
Транспонирование матриц и сумма положительных элементов по строкам C++
C++ Ввод, транспонирование, умножение и сложение матриц используя функций
Транспонирование матриц. Вынести часть кода в отдельную функцию C++
Класс: Двухмерный массив ([]-доступ по индексу,+-сложение матриц,--транспонирование матрицы) C++
Произведение матриц C++

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

Или воспользуйтесь поиском по форуму:
Mustakilloff
0 / 0 / 0
Регистрация: 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(); 
}
Yandex
Объявления
06.03.2014, 12:04     Транспонирование матриц. Произведение транспонированных матриц
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru