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

Транспонирование матрицы - C++

Восстановить пароль Регистрация
 
nikolas982
1 / 1 / 0
Регистрация: 10.09.2012
Сообщений: 49
16.09.2012, 12:08     Транспонирование матрицы #1
Помогите пожалуйста разобраться.
Транспонирована ли матрица в заданном коде?
Точнее, что является транспонированием в заданном коде.
Буду очень благодарен.

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
#include <iostream.h>
#include <conio.h>
#include <math.h>
main()
{
const int a=3, b=3;
int arr[a][b];
float arr2[a][b];
int x=0, y=0;
float det;
cout<<"\nMatrix:\n";
for (x=0; a>x; x++)
{
for (y=0; b>y; y++)
{
cout<<"\n"<<x+1<<":"<<y+1<<" ";
cin>>arr[x][y];
}
}
cout<<"\n";
for (x=0; a>x; x++)
{
for (y=0; b>y; y++)
{
cout<<"\t"<<arr[x][y];
}
cout<<"\n";
}
cout<<"\n";
det=(arr[0][0]*arr[1][1]*arr[2][2])+(arr[0][1]*arr[1][2]*arr[2][0])+(arr[0][2]*arr[1][0]*arr[2][1])-(arr[0][2]*arr[1][1]*arr[2][0])-(arr[0][1]*arr[1][0]*arr[2][2])-(arr[0][0]*arr[1][2]*arr[2][1]);
arr2[0][0]=((arr[1][1]*arr[2][2])-(arr[1][2]*arr[2][1]))/det;
arr2[0][1]=((arr[1][0]*arr[2][2])-(arr[1][2]*arr[2][0]))/det;
arr2[0][2]=((arr[1][0]*arr[2][1])-(arr[1][1]*arr[2][0]))/det;
arr2[1][0]=((arr[0][1]*arr[2][2])-(arr[0][2]*arr[2][1]))/det;
arr2[1][1]=((arr[0][0]*arr[2][2])-(arr[0][2]*arr[2][0]))/det;
arr2[1][2]=((arr[0][0]*arr[2][1])-(arr[0][1]*arr[2][0]))/det;
arr2[2][0]=((arr[0][1]*arr[1][2])-(arr[0][2]*arr[1][1]))/det;
arr2[2][1]=((arr[0][0]*arr[1][2])-(arr[0][2]*arr[1][0]))/det;
arr2[2][2]=((arr[0][0]*arr[1][1])-(arr[0][1]*arr[1][0]))/det;
for (y=0; b>y; y++)
{
for (x=0; a>x; x++)
{
cout<<"\t"<<arr2[y][x];
}
cout<<"\n";
}
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.09.2012, 12:08     Транспонирование матрицы
Посмотрите здесь:

Транспонирование матрицы C++
Транспонирование матрицы C++
C++ транспонирование матрицы
C++ Транспонирование матрицы
транспонирование матрицы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
16.09.2012, 13:38     Транспонирование матрицы #2
Цитата Сообщение от nikolas982 Посмотреть сообщение
Транспонирована ли матрица в заданном коде?
нет.
здесь вычисляется обратная матрица, повернутая на 90 градусов.
Арсенал
144 / 66 / 6
Регистрация: 30.12.2011
Сообщений: 137
16.09.2012, 13:57     Транспонирование матрицы #3
Транспонированная матрица имеет вид

C++
1
a[i][j] = b[j][i];
nikolas982
1 / 1 / 0
Регистрация: 10.09.2012
Сообщений: 49
16.09.2012, 14:53  [ТС]     Транспонирование матрицы #4
В моем случае получается:

C++
1
2
3
4
5
6
7
for (int y = 0; b < y; y++) 
    for (int x = 0; a < x; x++) 
    { 
        tmp = a[i][i]; 
        arr[a][b] = arr2[b][a]; 
        arr2[b][a] = tmp; 
    }
И на сколько я понял, писать нужно сразу после вычисление минора?
IrineK
Заблокирован
16.09.2012, 15:23     Транспонирование матрицы #5
Нужно учесть следующее: если определитель равен 0 (строка 30), то в г**коде строк 31-39 получаем деление на 0.
nikolas982
1 / 1 / 0
Регистрация: 10.09.2012
Сообщений: 49
16.09.2012, 15:33  [ТС]     Транспонирование матрицы #6
Цитата Сообщение от IrineK Посмотреть сообщение
Нужно учесть следующее: если определитель равен 0 (строка 30), то в г**коде строк 31-39 получаем деление на 0.
Речь сейчас не об этом, определитель будет равен нулю при введении определенных чисел.И не обязательно писать г**код, можно просто помочь, а не утыкать носом самоучку.
Я прошу помощи в транспонировании.
IrineK
Заблокирован
16.09.2012, 15:46     Транспонирование матрицы #7
Я уже решала эту задачу для вас: Найти обратную матрицу
Транспонирование: строки 54-59

Насчет самоучек, объем знаний данной категории может быть:
1) меньше
2) равен
3) больше
объему таковых у остальных обучаемых.
Выбирайтесь из подгруппы 1)
nikolas982
1 / 1 / 0
Регистрация: 10.09.2012
Сообщений: 49
16.09.2012, 15:58  [ТС]     Транспонирование матрицы #8
Я запускал то, что Вы писали мне.И очень благодарен.
Но написано уж очень сложно (для меня).
Написал свой код программы, все работает.Буквально пару дней назад, det не мог рассчитать, а тут даже минор нашел.Просто к написанному мною коду, хочу добавить транспонирование.
Возможно ли это без переделки кода?
Уткнувшись в очередной справочник, получилось вот что:

C++
1
2
3
4
5
6
7
for (int y = 0; b < y; y++) 
    for (int x = 0; a < x; x++) 
    { 
        tmp = a[i][i]; 
        arr[a][b] = arr2[b][a]; 
        arr2[b][a] = tmp; 
    }
Думаю написать это после расчета минора.

Стараюсь выбраться из 1 группы)
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
16.09.2012, 18:22     Транспонирование матрицы #9
Цитата Сообщение от nikolas982 Посмотреть сообщение
Просто к написанному мною коду, хочу добавить транспонирование.
Возможно ли это без переделки кода?
возможно:
Сама матрица arr[][] становится транспонированной:
C++
1
2
3
4
5
6
7
for (int x = 1; a > x; x++) 
    for (int y = 0; y < x; y++) 
    { 
        tmp = a[x][y]; 
        arr[x][y] = arr[y][x]; 
        arr[y][x] = tmp; 
    }
Или так: матрица arr2[][] будет транспонированной (только тип ее сделайте не float , а int, как и у матрицы arr[][]):
C++
1
2
3
4
5
for (int y = 0; b > y; y++) 
    for (int x = 0; a > x; x++) 
    {         
        arr2[y][x] = arr[x][y];         
    }
nikolas982
1 / 1 / 0
Регистрация: 10.09.2012
Сообщений: 49
16.09.2012, 19:18  [ТС]     Транспонирование матрицы #10
Спасибо!)
Но как только я изменяю float на int, получается много ошибок.
Написал то, что Вы написали:
C++
1
2
3
4
5
for (int y = 0; b > y; y++) 
    for (int x = 0; a > x; x++) 
    {         
        arr2[y][x] = arr[x][y];         
    }

Вместо вот этого (строки 40-43):
C++
1
2
3
4
for (y=0; b>y; y++)
{
for (x=0; a>x; x++)
{
Возможно я что то не так делаю, может не нужно ничего удалять, а просто добавить пару строк в правильном порядке?Спасибо за то, что помогаете)
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
16.09.2012, 19:27     Транспонирование матрицы #11
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
#include <iostream.h>
#include <conio.h>
#include <math.h>
 
int main()
{
const int a=3, b=3;
int arr[a][b];
int arr2[a][b];
int x=0, y=0;
float det;
cout<<"\nMatrix:\n";
for (x=0; a>x; x++)
{
for (y=0; b>y; y++)
{
cout<<"\n"<<x+1<<":"<<y+1<<" ";
cin>>arr[x][y];
}
}
cout<<"\n";
for (x=0; a>x; x++)
{
for (y=0; b>y; y++)
{
cout<<"\t"<<arr[x][y];
}
cout<<"\n";
}
cout<<endl<<endl;
 
for (int y = 0; b > y; y++) 
    for (int x = 0; a > x; x++) 
    {         
        arr2[y][x] = arr[x][y];         
    }
 
for (x=0; a>x; x++)
{
for (y=0; b>y; y++)
{
cout<<"\t"<<arr2[x][y];
}
cout<<"\n";
}
return 0;
}
nikolas982
1 / 1 / 0
Регистрация: 10.09.2012
Сообщений: 49
16.09.2012, 19:39  [ТС]     Транспонирование матрицы #12
valeriikozlov, спасибо!)
Получается что нахождение det и минора было не важно?
По идее нужно, что бы полученная обратная матрица была транспонированной.

C++
1
2
3
4
5
6
7
8
9
10
det=(arr[0][0]*arr[1][1]*arr[2][2])+(arr[0][1]*arr[1][2]*arr[2][0])+(arr[0][2]*arr[1][0]*arr[2][1])-(arr[0][2]*arr[1][1]*arr[2][0])-(arr[0][1]*arr[1][0]*arr[2][2])-(arr[0][0]*arr[1][2]*arr[2][1]);
arr2[0][0]=((arr[1][1]*arr[2][2])-(arr[1][2]*arr[2][1]))/det;
arr2[0][1]=((arr[1][0]*arr[2][2])-(arr[1][2]*arr[2][0]))/det;
arr2[0][2]=((arr[1][0]*arr[2][1])-(arr[1][1]*arr[2][0]))/det;
arr2[1][0]=((arr[0][1]*arr[2][2])-(arr[0][2]*arr[2][1]))/det;
arr2[1][1]=((arr[0][0]*arr[2][2])-(arr[0][2]*arr[2][0]))/det;
arr2[1][2]=((arr[0][0]*arr[2][1])-(arr[0][1]*arr[2][0]))/det;
arr2[2][0]=((arr[0][1]*arr[1][2])-(arr[0][2]*arr[1][1]))/det;
arr2[2][1]=((arr[0][0]*arr[1][2])-(arr[0][2]*arr[1][0]))/det;
arr2[2][2]=((arr[0][0]*arr[1][1])-(arr[0][1]*arr[1][0]))/det;
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
16.09.2012, 19:48     Транспонирование матрицы #13
Цитата Сообщение от nikolas982 Посмотреть сообщение
По идее нужно, что бы полученная обратная матрица была транспонированной.
хорошо, тогда так:
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.h>
#include <conio.h>
#include <math.h>
int main()
{
const int a=3, b=3;
int arr[a][b];
float arr2[a][b];
int x=0, y=0;
float det, tmp;
cout<<"\nMatrix:\n";
for (x=0; a>x; x++)
{
for (y=0; b>y; y++)
{
cout<<"\n"<<x+1<<":"<<y+1<<" ";
cin>>arr[x][y];
}
}
cout<<"\n";
for (x=0; a>x; x++)
{
for (y=0; b>y; y++)
{
cout<<"\t"<<arr[x][y];
}
cout<<"\n";
}
cout<<"\n";
det=(arr[0][0]*arr[1][1]*arr[2][2])+(arr[0][1]*arr[1][2]*arr[2][0])+(arr[0][2]*arr[1][0]*arr[2][1])-(arr[0][2]*arr[1][1]*arr[2][0])-(arr[0][1]*arr[1][0]*arr[2][2])-(arr[0][0]*arr[1][2]*arr[2][1]);
arr2[0][0]=((arr[1][1]*arr[2][2])-(arr[1][2]*arr[2][1]))/det;
arr2[0][1]=((arr[1][0]*arr[2][2])-(arr[1][2]*arr[2][0]))/det;
arr2[0][2]=((arr[1][0]*arr[2][1])-(arr[1][1]*arr[2][0]))/det;
arr2[1][0]=((arr[0][1]*arr[2][2])-(arr[0][2]*arr[2][1]))/det;
arr2[1][1]=((arr[0][0]*arr[2][2])-(arr[0][2]*arr[2][0]))/det;
arr2[1][2]=((arr[0][0]*arr[2][1])-(arr[0][1]*arr[2][0]))/det;
arr2[2][0]=((arr[0][1]*arr[1][2])-(arr[0][2]*arr[1][1]))/det;
arr2[2][1]=((arr[0][0]*arr[1][2])-(arr[0][2]*arr[1][0]))/det;
arr2[2][2]=((arr[0][0]*arr[1][1])-(arr[0][1]*arr[1][0]))/det;
for (y=0; b>y; y++)
{
for (x=0; a>x; x++)
{
cout<<"\t"<<arr2[y][x];
}
cout<<"\n";
}
cout<<endl<<endl;
for (x = 1; a > x; x++) 
    for ( y = 0; y < x; y++) 
    { 
        tmp = arr2[x][y]; 
        arr2[x][y] = arr2[y][x]; 
        arr2[y][x] = tmp; 
    }
for (y=0; b>y; y++)
{
for (x=0; a>x; x++)
{
cout<<"\t"<<arr2[y][x];
}
cout<<"\n";
}
return 0;
}
Я писал ранее:
Цитата Сообщение от valeriikozlov Посмотреть сообщение
здесь вычисляется обратная матрица, повернутая на 90 градусов.
на самом деле я немного ошибся.
Ваш начальный код вычисляет обратную матрицу, но не повернутую на 90 градусов, а транспонированную.
Поэтому если Вам нужно:

Цитата Сообщение от nikolas982 Посмотреть сообщение
По идее нужно, что бы полученная обратная матрица была транспонированной.
то Ваш начальный код это и делает
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2012, 19:53     Транспонирование матрицы
Еще ссылки по теме:

Транспонирование матрицы. C++
C++ Транспонирование матрицы
C++ Транспонирование матрицы

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

Или воспользуйтесь поиском по форуму:
nikolas982
1 / 1 / 0
Регистрация: 10.09.2012
Сообщений: 49
16.09.2012, 19:53  [ТС]     Транспонирование матрицы #14
Большое спасибо, работает на ура!)Вы очень помогли мне.
Yandex
Объявления
16.09.2012, 19:53     Транспонирование матрицы
Ответ Создать тему
Опции темы

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