Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
1 / 1 / 1
Регистрация: 19.02.2018
Сообщений: 33

Создать обратную матрицу

16.02.2019, 18:15. Показов 2537. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, нужно создать функцию, которая будет находить обратную матрицу из динамического массива типа double, который вводиться пользователем.

Я думаю код, который я написал, объяснит задание немного

Вот мои наработки по созданию динамического масива:

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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <ctime>
#include <cmath>
 
using namespace std;
 
 
void TextMenu() {
    _gettch();
    system("cls");
    cout << "To see arrays, tap s" << endl;
    cout << "Edit the first matrix, tap 1" << endl;
    cout << "Edit in the second matrix, tap 2" << endl;
    cout << "To inverse the first matrix, tap 3" << endl;
    cout << "To restart work, tap r" << endl;
    cout << "To end work, tap 0" << endl;
}
 
 
 
void RandArray(double **Array, int countRow, int countColumn)
{
    for (int i = 0; i < countRow; i++)
        for (int j = 0; j < countColumn; j++)
            Array[i][j] = 1.5 * (rand() % 15 - 5);
}
 
void HandArray(double **Array, int countRow, int countColumn)
{
    cout << "Enter elements of matrix: " << endl;
    for (int i = 0; i < countRow; i++)
        for (int j = 0; j < countColumn; j++)
            cin >> Array[i][j];
}
 
void EditArray(double **&Array, int&countRow, int &countColumn) {
    for (int i = 0; i < countRow; i++)
        delete[] Array[i];
    delete[] Array;
 
    cout << "Enter the dimension of the array:";
    cin >> countRow >> countColumn;
 
    int c;
    cout << "Fill in the matrix automatically? tap '1' if 'Yes'! " << endl;
    cin >> c;
 
    double ** tmp = new double*[countRow];
    for (int i = 0; i < countRow; ++i)
        tmp[i] = new double[countColumn];
 
    if (c == 1)
        RandArray(tmp, countRow, countColumn);
    else
        HandArray(tmp, countRow, countColumn);
    Array = tmp;
    system("cls");
}
 
void SeeArray(double** Array, int countRow, int countColumn) {
    for (int i = 0; i < countRow; i++)
    {
        for (int j = 0; j < countColumn; j++) {
            cout.width(6);
            cout.right;
            cout << Array[i][j];
        }
        cout << endl << endl;
    }
}
 
void Inverse(double** Array, int countRow, int countColumn){
/*
 Какой то код
*/
}
 
int main()
{
    srand(time(0));
Again:
    int n = 1, m = 1, k = 1, l = 1, num = 1;
    char answer;
 
    double ** FArray = new double *[n];
    for (int i = 0; i < n; ++i)
        FArray[i] = new double[m];
    EditArray(FArray, n, m);
 
    double** SArray = new double *[k];
    for (int i = 0; i < k; ++i)
        SArray[i] = new double[l];
    EditArray(SArray, k, l);
 
 
    cout << "Your first array:" << endl;
    SeeArray(FArray, n, m);
 
    cout << "Your second array:" << endl;
    SeeArray(SArray, k, l);
 
    while (1) {
        TextMenu();
        cin >> answer;
        switch (answer) {
 
        case's':
            cout << "It`s yours arrays:" << endl;
            SeeArray(FArray, n, m);
            cout << endl;
            SeeArray(SArray, k, l);
            break;
 
        case '1':
            EditArray(FArray, n, m);
            SeeArray(FArray, n, m);
            break;
 
        case '2':
            EditArray(SArray, k, l);
            SeeArray(SArray, k, l);
            break;
 
        case '3':
            if (n == m) {
                Inverse(FArray, n, m);
                cout << "It`s a new first array:" << endl;
                SeeArray(FArray, n, m);
            }
            else
                cout << "Error! Array have invalid size!" << endl << "Change your matrix and repeat again!";
            break;
 
        case '0':
            for (int i = 0; i < n; i++)
                delete[] FArray[i];
            delete[] FArray;
 
            for (int i = 0; i < k; i++)
                delete[] SArray[i];
            delete[] SArray;
            return 0;
 
        case 'r':
            for (int i = 0; i < n; i++)
                delete[] FArray[i];
            delete[] FArray;
 
            for (int i = 0; i < k; i++)
                delete[] SArray[i];
            delete[] SArray;
            goto Again;
 
        default:
            cout << "Wrong input! Repeat again" << endl;
            _gettch();
        }
 
    }
}


На просторах интернета нашел вот такой код, но не могу его запихнуть под свою програму и он только для матрицы 3х3:


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
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <ctime>
 
using namespace std;
 
//алгебраическое допополнение к элементу a[row][col]
double add(double a[3][3], int row, int col)
{
    double b[2][2];
    int i, j, bi, bj;
 
    for (i = 0, bi = 0;i<3;i++)
    {
        if (i != row)
        {
            for (j = 0, bj = 0;j<3;j++)
                if (j != col)
                {
                    b[bi][bj] = a[i][j];
                    bj++;
                }
            bi++;
        }
    }
 
    if ((row + col) % 2)
        return b[0][1] * b[1][0] - b[0][0] * b[1][1];
    else
        return b[0][0] * b[1][1] - b[0][1] * b[1][0];
}
 
 
//определитель матрицы
double det(double a[3][3])
{
    int i;
    double sum;
 
    for (i = 0, sum = 0.;i<3;i++)
        sum += a[i][0] * add(a, i, 0);
 
    return sum;
}
 
 
//обратная матрица
void inverse(double a[3][3], double d)
{
    double a1[3][3], cur;
    int i, j;
 
    for (i = 0;i<3;i++)
        for (j = 0;j<3;j++)
            a1[i][j] = add(a, i, j) / d;
 
    for (i = 0;i<3;i++)
        for (j = i + 1;j<3;j++)
        {
            cur = a1[i][j];
            a1[i][j] = a1[j][i];
            a1[j][i] = cur;
        }
 
    cout << "\nInverse:\n";
    for (i = 0;i<3;i++)
    {
        for (j = 0;j<3;j++)
            cout << setw(7) << a1[i][j];
        cout << "\n";
    }
 
}
 
 
int main()
{
    double arr[3][3], determinant;
    int i, j;
 
    srand(time(NULL));
    for (i = 0;i<3;i++)
        for (j = 0;j<3;j++)
            arr[i][j] = 1.5 * (rand() % 9 - 5);
 
    cout << "Array:\n";
    for (i = 0;i<3;i++)
    {
        for (j = 0;j<3;j++)
            cout << setw(7) << setiosflags(ios::fixed) << setprecision(2) << arr[i][j];
        cout << "\n";
    }
 
    determinant = det(arr);
    cout << "\nDeterminant: " << determinant << "\n";
 
    if (determinant) inverse(arr, determinant);
    else cout << "Inverse impossible";
 
    getchar();
    return 0;
}
Уже не первый день ломаю голову и все никак не могу это реализовать, поэтому буду рад любой помощи. Заранее спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.02.2019, 18:15
Ответы с готовыми решениями:

Найти обратную матрицу
Добрый день, уважаемые форумчане! Я знаю, что подобные вопросы получали ответы в разных темах форума, я их подробно перечитала, но решить...

Найти обратную матрицу
Ребят немогу в конда сделал провереку, ошибку выдаёт, не могу найти ошибку помогите!!#include &lt;iostream&gt; #include &lt;cmath&gt; ...

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

5
 Аватар для Михаиллллллл
66 / 57 / 13
Регистрация: 16.03.2017
Сообщений: 426
16.02.2019, 18:27
создайте 3 цикла фор и в них меняйте местами значения марицы
0
1 / 1 / 1
Регистрация: 19.02.2018
Сообщений: 33
16.02.2019, 18:35  [ТС]
Какие три цикла? Не очень вас понимаю
0
 Аватар для Михаиллллллл
66 / 57 / 13
Регистрация: 16.03.2017
Сообщений: 426
16.02.2019, 19:05
вот ваша матрица A=new int (q*w*e);
прогоните ее
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
for(int i1 =0;i1<q;i1++)
{
for(int i2 =0;i2<w;i2++)
{
for(int i3 =0;i3<e;i3++)
{
int a =A[i1][i2][i3];
A[i1][i2][i3] = A[i1][i2][e-i3-1];
A[i1][i2][e-i3-1] = a;
}
}
}
и по такому принципу поменять остальное
0
1 / 1 / 1
Регистрация: 19.02.2018
Сообщений: 33
16.02.2019, 21:08  [ТС]
Извините, но все равно не очень понятно. Можете в первый код, тот что я скидывал, вставить ваш код. Там есть функция
C++
1
2
3
4
5
void Inverse(double** Array, int countRow, int countColumn){
/*
 Какой то код
*/
}
И на ее примере показать, буду очень благодарен
0
1 / 1 / 1
Регистрация: 19.02.2018
Сообщений: 33
17.02.2019, 11:59  [ТС]
И почему три переменных размера q, w, e. если массив двумерный?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.02.2019, 11:59
Помогаю со студенческими работами здесь

Матрицы: определить обратную матрицу
Для заданной в файле матрицы A (n на m) из целых чисел определить обратную ей матрицу B и записать в другой файл.

Найти матрицу, обратную заданной
Найти матрицу, обратную заданной

Как найти обратную матрицу?
Как найти обратную матрицу C# в visual studiо ?

Для матрицы а(n, n) найти обратную матрицу
Помогите пожалуйста с решением этих задач, а то я уже не знаю что с ними делать.... Задача 1 Для матрицы а(n, n) найти обратную...

Найти обратную матрицу методом Гаусса
Задание: Найти обратную матрицу методом Гаусса. Программа неправильно работает // ConsoleApplication8.cpp: определяет точку входа для...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru