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

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

Войти
Регистрация
Восстановить пароль
 
Toffin
0 / 0 / 0
Регистрация: 29.06.2014
Сообщений: 4
#1

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

17.07.2014, 16:13. Просмотров 701. Ответов 6
Метки нет (Все метки)

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

Перестановка строк и столбцов в матрице - C++
Добрый день программисты! Вопрос заключается в том как сделать так чтобы можно было переставлять строки и(или) столбцы в нужном порядке. ...

Перестановка местами строк и столбцов матрицы - C++
Помогите решить задачу: Дана матрица А(nxm).Получить матрицу, получающуюся из данной : перестановкой строк- первой с последней, второй с...

Дана матрица целых чисел, из n строк и n столбцов (n < = 100).Определить является ли матрица нулевой (состоит из одних нулей) - C++
#include &lt;iostream.h&gt; #include &lt;iomanip.h&gt; #include&lt;conio.h&gt; void main() { int mas; int N; int max_element; int...

Дана матрица целых чисел, из n строк и n столбцов (n < = 100).Определить является ли матрица нулевой (состоит из одних нулей) - C++
#include &lt;iostream.h&gt; #include &lt;iomanip.h&gt; #include &lt;stdlib.h&gt; int main(int argc, char* argv) { srand(time(NULL)); int mas; ...

Дана матрица, состоящая из М строк и N столбцов - C++
Дана матрица А, состоящая из М строк и N столбцов. Элементами матрицы являются натуральные числа. Вывести на экран количество элементов...

Дана матрица вещественных величин D, состоящая из 9 строк и 7 столбцов. - C++
Дана матрица вещественных величин D, состоящая из 9 строк и 7 столбцов. Требуется упорядочить по возрастанию четвертый столбец в...

6
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
0
salam
18.07.2014, 11:03
  #3

Не по теме:

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

0
Psilon
Master of Orion
Эксперт .NET
5909 / 4806 / 634
Регистрация: 10.07.2011
Сообщений: 14,407
Записей в блоге: 5
Завершенные тесты: 4
18.07.2014, 12:44 #4
Toffin, вам словосочетание "преобразование гаусса-жордана" о чем-нибудь говорит?
0
-=ЮрА=-
18.07.2014, 12:46
  #5

Не по теме:

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

0
Psilon
Master of Orion
Эксперт .NET
5909 / 4806 / 634
Регистрация: 10.07.2011
Сообщений: 14,407
Записей в блоге: 5
Завершенные тесты: 4
18.07.2014, 12:46 #6
мне кстати интересно, для матрицы размерности n будем проверять Cnk комбинаций, для которой решение все же существует? :hmmm:
0
-=ЮрА=-
Заблокирован
Автор FAQ
18.07.2014, 12:48 #7
Toffin, всё просто заведи цикл обмена строк матрицы и каждый раз при обмене находи детерминант, как только det != 0 найдёшь решение. Как находить определитель и обратную матрицу можешь прочесть здесь http://www.cyberforum.ru/faq/thread436065-page2.html#post2471796
0
18.07.2014, 12:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2014, 12:48
Привет! Вот еще темы с ответами:

Матрица (Не получается ввести с клавиатуры произвольные число строк и столбцов массива) - C++
Доброго всем времени суток.Помогите разобраться.Я самостоятельно изучаю С++.Разбираясь с двумерными массивами с толкнулся с проблемой.Не...

Создать класс Massiv (матрица вещественных чисел), количество строк и столбцов константные поля. - C++
Помогите решить с объяснениями. Создать класс Massiv (матрица вещественных чисел), количество строк и столбцов константные поля. ...

Дана целочисленная прямоугольная матрица.Определить номера строк и столбцов всех седловых точек матрицы - C++
Вот начал писать, а дальше не знаю что писать.помогите #include &quot;stdafx.h&quot; #include&lt;iostream&gt; #include&lt;time.h&gt; using namespace...

Дана матрица размера NXM. Найти суммы элементов всех её чётных, нечётных строк, столбцов - C++
// Матрицы.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include&lt;conio.h&gt; #include&lt;iostream&gt; ...


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

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

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