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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 113
#1

Нахождение обратной матрицы - C++

11.05.2014, 01:14. Просмотров 1511. Ответов 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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include <cmath>
 
// Функция, производящая обращение матрицы.
// Принимает:
//     matrix - матрица для обращения
//     result - матрица достаточного размера для вмещения результата
//     size   - размерность матрицы
// Возвращает:
//     true в случае успешного обращения, false в противном случае
bool inverse(double **matrix, double **result, int size)
{   
    // Изначально результирующая матрица является единичной
    // Заполняем единичную матрицу
    for (int i = 0; i < size; ++i)
    {
        for (int j = 0; j < size; ++j)
            result[i][j] = 0.0;
        
        result[i][i] = 1.0;
    }
    
    // Копия исходной матрицы
    double **copy = new double *[size]();
    
    // Заполняем копию исходной матрицы
    for (int i = 0; i < size; ++i)
    {
        copy[i] = new double [size];
        
        for (int j = 0; j < size; ++j)
            copy[i][j] = matrix[i][j];
    }
    
    // Проходим по строкам матрицы (назовём их исходными)
    // сверху вниз. На данном этапе происходит прямой ход
    // и исходная матрица превращается в верхнюю треугольную
    for (int k = 0; k < size; ++k)
    {
        // Если элемент на главной диагонали в исходной
        // строке - нуль, то ищем строку, где элемент
        // того же столбца не нулевой, и меняем строки
        // местами
        if (fabs(copy[k][k]) < 1e-8)
        {
            // Ключ, говорязий о том, что был произведён обмен строк
            bool changed = false;
            
            // Идём по строкам, расположенным ниже исходной
            for (int i = k + 1; i < size; ++i)
            {
                // Если нашли строку, где в том же столбце
                // имеется ненулевой элемент
                if (fabs(copy[i][k]) > 1e-8)
                {
                    // Меняем найденную и исходную строки местами
                    // как в исходной матрице, так и в единичной
                    std::swap(copy[k],   copy[i]);
                    std::swap(result[k], result[i]);
                    
                    // Взводим ключ - сообщаем о произведённом обмене строк
                    changed = true;
                    
                    break;
                }
            }
            
            // Если обмен строк произведён не был - матрица не может быть
            // обращена
            if (!changed)
            {
                // Чистим память
                for (int i = 0; i < size; ++i)
                    delete [] copy[i];
                
                delete [] copy;
                
                // Сообщаем о неудаче обращения
                return false;
            }
        }
        
        // Запоминаем делитель - диагональный элемент
        double div = copy[k][k];
        
        // Все элементы исходной строки делим на диагональный
        // элемент как в исходной матрице, так и в единичной
        for (int j = 0; j < size; ++j)
        {
            copy[k][j]   /= div;
            result[k][j] /= div;
        }
        
        // Идём по строкам, которые расположены ниже исходной
        for (int i = k + 1; i < size; ++i)
        {
            // Запоминаем множитель - элемент очередной строки,
            // расположенный под диагональным элементом исходной
            // строки
            double multi = copy[i][k];
            
            // Отнимаем от очередной строки исходную, умноженную
            // на сохранённый ранее множитель как в исходной,
            // так и в единичной матрице
            for (int j = 0; j < size; ++j)
            {
                copy[i][j]   -= multi * copy[k][j];
                result[i][j] -= multi * result[k][j];
            }
        }
    }
    
    // Проходим по вернхней треугольной матрице, полученной
    // на прямом ходе, снизу вверх
    // На данном этапе происходит обратный ход, и из исходной
    // матрицы окончательно формируется единичная, а из единичной -
    // обратная
    for (int k = size - 1; k > 0; --k)
    {
        // Идём по строкам, которые расположены выше исходной
        for (int i = k - 1; i + 1 > 0; --i)
        {
            // Запоминаем множитель - элемент очередной строки,
            // расположенный над диагональным элементом исходной
            // строки
            double multi = copy[i][k];
            
            // Отнимаем от очередной строки исходную, умноженную
            // на сохранённый ранее множитель как в исходной,
            // так и в единичной матрице
            for (int j = 0; j < size; ++j)
            {
                copy[i][j]   -= multi * copy[k][j];
                result[i][j] -= multi * result[k][j];
            }
        }
    }
    
    // Чистим память
    for (int i = 0; i < size; ++i)
        delete [] copy[i];
    
    delete [] copy;
    
    // Сообщаем об успехе обращения
    return true;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.05.2014, 01:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нахождение обратной матрицы (C++):

Нахождение обратной матрицы - C++
Помогите,пожалуйста доделать или переделать нужно найти обратную матрицу тут маленько наброски есть методом гаусса но не могу доделать или...

Нахождение обратной матрицы - C++
Здравствуйте, уважаемые программисты! Прощу помощи. Для заданной матрицы A(3,3), найти обратную А в -1 степени. Буду очень...

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

Нахождение обратной матрицы - C++
Доброго времени суток! Возникла необходимость найти обратную матрицу любым из способов, так как в программировании только делаю первые...

Нахождение обратной матрицы - C++
Здравствуйте!помогите с программой на языке си-она демонстрирует нахождение обратной матрицы.я написал 3 на 3 юно мне надо в начале проги...

Нахождение обратной матрицы - C++
Доброго времени суток! Напишите, пожалуйста, кому не сложно, простой, понятный код нахождения обратной матрицы. Буду очень признателен!

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Oxie
Заблокирован
11.05.2014, 11:35 #2
А обратная матрица - это матрица транспонированная или нет?
0
Donville
0 / 0 / 0
Регистрация: 16.02.2014
Сообщений: 113
11.05.2014, 13:32  [ТС] #3
http://ru.wikipedia.org/wiki/%D0%9E%...B8%D1%86%D0%B0
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2014, 13:32
Привет! Вот еще темы с ответами:

Умножение матрицы на матрицу, и нахождение обратной матрицы - C++
Здравствуйте! нужно написать программу, которая могла бы производить всякие операции над матрицами (двухмерными массивами) меня...

Матричный калькулятор, нахождение обратной матрицы - C++
Всё работает кроме обратной матрицы.помогите найти ошибку #include &quot;stdafx.h&quot; #include&lt;iostream&gt; #include&lt;math.h&gt; ...

Нахождение обратной матрицы (есть код! ) - C++
Добрый день! Имеется алгоритм нахождения обратной матрицы. Необходимо добавить в него регуляризацию, т.е. этот алгоритм может не найти...

Нахождение обратной матрицы методом алгебраических дополнений - C++
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; //int menu(); void...


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

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

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