Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

17.02.2014, 06:44. Просмотров 1633. Ответов 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^
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2014, 06:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Транспонирование матриц. Произведение транспонированных матриц (C++):

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

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

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

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

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

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

21
Ev_Hyper
Заблокирован
17.02.2014, 10:40 #2
С чем трудности?
0
Mustakilloff
0 / 0 / 0
Регистрация: 19.03.2013
Сообщений: 37
17.02.2014, 10:47  [ТС] #3
Ev_Hyper, конкретно с переводом матриц А и В в транспонированные и нахождением С. Никак не могу разобраться, билиберда получается какая-то.
0
Ev_Hyper
Заблокирован
17.02.2014, 11:16 #4
теорию знаете?
0
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}

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

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

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

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

Транспонирование матриц и сумма положительных элементов по строкам - C++
Помогите разработать программу формирование матриц А(3х3) и С(4х4) путем транспонирования заданных начальными значениями матриц В(3х3) и...

Транспонирование, умножение и вычитание матриц, отчет в Mathcad - C++
Помогите пожалуйста написать программу, нужно в С++ сделать программу транспонирующий, умножающий, вычитающий матрицы и чтобы ответ...

Ввод, транспонирование, умножение и сложение матриц используя функций - C++
Есть две матрицы, каждую из них надо транспонировать и умножить на себя, полученные две матрицы сложить, т.е в конце должна выводиться одна...

Транспонирование матриц. Вынести часть кода в отдельную функцию - C++
/* транспонировать матрицу, используя функции. я матрицу транспонировал, а через функцию не знаю как правильно делать, нужна помощь */ ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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