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

Обратная матрица (перестановка строк и столбцов) - C++

Восстановить пароль Регистрация
 
Toffin
0 / 0 / 0
Регистрация: 29.06.2014
Сообщений: 4
17.07.2014, 16:13     Обратная матрица (перестановка строк и столбцов) #1
Как сделать сортировку столбцов матрицы?Т.е если у меня по главной диагонали есть нуль,надо вместо этого столбца(где есть нуль) поставить столбец без нуля,а тот столбец на место этого.например
матрица
0 7 0
А= 0 0 4
5 0 0
для этой матрицы обратной не существует,если ее преобразовывать,а вот если поменять строки местами и получить матрицу
7 0 0
В= 0 4 0
0 0 5
тогда обратная матрица для В будет равна
0.14 0 0
0 0.25 0
0 0 0.2

тогда для А обратной будет
0 0.25 0
0 0 0.2
0.14 0 0
_____________________________________
Как это сделать?Помогите!!!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2014, 16:13     Обратная матрица (перестановка строк и столбцов)
Посмотрите здесь:

C++ Создать класс Massiv (матрица вещественных чисел), количество строк и столбцов константные поля.
C++ [C++] Перестановка строк и столбцов матрицы
C++ Дана матрица размера N×M. Найти максимальный среди элементов тех строк|столбцов, которые упорядочены либо по возрастанию
Дана матрица вещественных величин D, состоящая из 9 строк и 7 столбцов. C++
Матрица (Не получается ввести с клавиатуры произвольные число строк и столбцов массива) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
B@R_LOG
 Аватар для B@R_LOG
18 / 18 / 0
Регистрация: 03.07.2013
Сообщений: 49
17.07.2014, 18:03     Обратная матрица (перестановка строк и столбцов) #2
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
#include "stdafx.h" // for Visual Studio
#include "iostream"
using namespace std;
/* Как сделать сортировку столбцов матрицы?
1. если у меня по главной диагонали есть нуль, надо вместо этого столбца (где есть нуль)
поставить столбец без нуля, а тот столбец на место этого. 
0 7 0           7 0 0
0 0 4   =>      0 0 4
5 0 0           0 5 0
2. для этой матрицы обратной не существует,если ее преобразовывать,
а вот если поменять строки местами и получить матрицу
7 0 0
0 4 0
0 0 5
*/
//random
#include <conio.h>
#include <stdlib.h>
 
double ** creat_array2d(int m, int n)
{
    double* *array2d;
    array2d = new double*[m];
    for (int i = 0; i<m; i++)
        array2d[i] = new double[n];
    return array2d;
}
//=======================================
void delete_array2d(double **array2d, int m)
{
    for (int i = 0; i<m; i++)
        delete[] array2d[i];
    delete[] array2d;
}
//=======================================
 
void checking(double* *array2d, int m, int n)
{
    for (int i = 0; i<m; i++)
    {
        for (int j = 0; j<(n - 1); j++)
            cout << "a[" << i + 1 << "," << j + 1 << "]= " << array2d[i][j] << "    ";
        cout << "b[" << i + 1 << "]= " << array2d[i][n - 1];
        cout << endl;
    }
}
 
//=======================================
int random(int N) { return rand() % N; }
 
//=======================================
void input_array2d(double* *array2d, int m, int n)
{
    cout << "You are welcomed by the program of input of numerical values." << endl;
    cout << "If you want to enter them - enter '1', differently '2'." << endl;
    char key = '0';
    do { cin >> key; } while ((key != '1') && (key != '2'));
 
    if (key == '1')
    {
        cout << endl << endl << "Please, enter unknown persons consistently from left to right." << endl;
        for (int i = 0; i<m; i++)
            for (int j = 0; j<n; j++)
                cin >> array2d[i][j];
    }
    else
    {
        for (int i = 0; i<m; i++)
            for (int j = 0; j<n; j++)
                array2d[i][j] = random(100);
        cout << endl << endl << "Numerical values in system of the linear equations have been set in a random way." << endl;
        checking(array2d, m, n);
    }
    cout << endl;
}
 
int main()
{
    int n = -1;
    cout << "Please, enter size of the matrix (n*n) " << endl;
    while (n < 1)
        if (cin >> n)  {/* */ } else { cin.clear(); n = -1; }
    
    //Allocation of memory for a two-dimensional array of dimension m on n.
    double **array2d = creat_array2d(n, n);
    input_array2d(array2d, n, n);
    checking(array2d, n, n);
 
    // проверяем диагональные элементы
    for (int i = 0; i < n; i++) 
            if (array2d[i][i] == 0)   //нашли столбец, у которого диагональный элемент = 0
            {  
                // ищем столбец, на который можно заменить
                int num = -1;
                for (int j = 0; j < n; j++)
                    if (array2d[i][j] != 0)  { num = j; j = n; }
                if (num == -1)  {/* нет такого столбца */}
                else // меняем местами
                {
                    int z;
                    for (int k = 0; k < n; k++)
                    {
                        z = array2d[k][i];
                        array2d[k][i] = array2d[k][num];
                        array2d[k][num] = z;
                    }
                }
                
            }
        
            
    cout << endl;
    checking(array2d, n, n);
    delete_array2d(array2d, n);
    system("pause");
}
Первый пункт работает, во втором - идея аналогична.
По реализации: нужно проверять, что мы при следующем проходе не меняем обратно столбцы, что меняли ранее.
Матрица для теста:
0 1 0
0 1 0
1 1 1
salam
18.07.2014, 11:03
  #3

Не по теме:

Если вы вдруг думаете, что для любой матрицы с неотрицательными элементами на главной диагонали есть обратная - передумайте.

Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
18.07.2014, 12:44     Обратная матрица (перестановка строк и столбцов) #4
Toffin, вам словосочетание "преобразование гаусса-жордана" о чем-нибудь говорит?
-=ЮрА=-
18.07.2014, 12:46
  #5

Не по теме:

Цитата Сообщение от salam Посмотреть сообщение
Если вы вдруг думаете, что для любой матрицы с неотрицательными элементами на главной диагонали есть обратная - передумайте.
, главное чтобы детерминант ненулевым был да матрица квадратной была.

Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
18.07.2014, 12:46     Обратная матрица (перестановка строк и столбцов) #6
мне кстати интересно, для матрицы размерности n будем проверять Cnk комбинаций, для которой решение все же существует? :hmmm:
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2014, 12:48     Обратная матрица (перестановка строк и столбцов)
Еще ссылки по теме:

C++ Дана целочисленная прямоугольная матрица.Определить номера строк и столбцов всех седловых точек матрицы
Дана матрица, состоящая из М строк и N столбцов C++
C++ Перестановка строк и столбцов в матрице

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
18.07.2014, 12:48     Обратная матрица (перестановка строк и столбцов) #7
Toffin, всё просто заведи цикл обмена строк матрицы и каждый раз при обмене находи детерминант, как только det != 0 найдёшь решение. Как находить определитель и обратную матрицу можешь прочесть здесь http://www.cyberforum.ru/faq/thread4...ml#post2471796
Yandex
Объявления
18.07.2014, 12:48     Обратная матрица (перестановка строк и столбцов)
Ответ Создать тему
Опции темы

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