99 / 98 / 11
Регистрация: 12.09.2016
Сообщений: 195
1

Определитель матрицы

20.10.2018, 22:23. Показов 5456. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день.Проблема в том,что при n>= 4 программа падает с крахом,а в чем проблема понять не могу

"Определитель матрицы равен сумме произведений элементов столбца(строки) на соответствующие алгебраические дополнения."
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
#include <iostream>
#include <cmath>
#include <windows.h>
using namespace std;
double determinant(int **matrix,int k,int pillar)
{
    if(k==1) return matrix[0][0];
    if(k==2) return matrix[0][0]*matrix[1][1]-matrix[0][1]*matrix[1][0]; // частные случаи
    int t; // понадобится для заполнения миноров
    double det=0; // сам определитель
    int **new_matrix=new int*[k-1]; // соездаем минор
    for(int i=0;i<k-1;i++) new_matrix[i]=new int[k-1];
    
    for(int l=0;l<k;l++)
    {
        t=0;
            for (int i = 1; i < k; i++) 
            for (int j = 0; j < k; j++)
                if (j != pillar)
                    new_matrix[t / (k - 1)][t++ % (k - 1)] = matrix[i][j]; // заполнияем минор ( "вычеркиваем" всю первую строку и j-ый столбец)
        det+=pow(-1,l)*matrix[0][l]*determinant(new_matrix,k-1,pillar++); // вычисляем определитель
    }
    return det;
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int n;
    cout<<"Введите размер матрицы: ";
    cin>>n;
    int **matrix=new int*[n];
    for(int i=0;i<n;i++) matrix[i]=new int [n];
    cout<<"Введите матрицу: "<<endl;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            cin>>matrix[i][j];
    
    cout<<"Определитель вашей матрицы равен ";
    cout<<determinant(matrix,n,0)<<endl;
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.10.2018, 22:23
Ответы с готовыми решениями:

Определитель матрицы, ранг матрицы, обратная матрица
Вы можете помочь, сделать определитель матрицы, или у кого есть коде: ранг матрицы, обратная...

Определитель Матрицы
доброе время суток Напишите у кого есть код нахождения определителя матрицы мне надо 4х4 ну а...

Определитель матрицы
Всем добрый вечер=) Написал программу для вычисления определителя матрицы. Она запускается но...

Определитель матрицы
Не могу написать код реккурсивной ф-ии на С для подсчёта опредилителя матрцы nxn, помогите кто чем...

2
Диссидент
Эксперт C
27708 / 17324 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
20.10.2018, 22:44 2
Цитата Сообщение от Gaveyn Посмотреть сообщение
в чем проблема понять не могу
Скорее всего, переполнение стека.
0
Мозгоправ
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
21.10.2018, 02:22 3
Лучший ответ Сообщение было отмечено Gaveyn как решение

Решение

Байт, не угадал. ТС перемудрил с интексацией массива при заполнении минора и попытался залезть не в свою память. За что тут же получил по рукам.

Gaveyn, для задач чуть более сложных, чем тривиальные, надо использовать декомпозицию, что бы иметь дело с решением тривиальных задач. Кроме того, такой код проще отлаживать. Я там немножко подправил.

Заодно избавился от заголовка <cmath>.

И мусор за собой убирать надо привыкать с самого начала. В смысле утечек памяти.

Может стоит подумать использовать тип long вместо int для матрицы и дететрминанта. Или вообще перейти на 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
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <windows.h>
 
using namespace std;
 
// Определитель матрицы равен сумме произведений элементов столбца (строки) 
// на соответствующие алгебраические дополнения.
 
// minor - результат
// src - исходная матрица
// size - размер исходной матрицы
// r_excl - номер вычёркиваемой строки (< size!)
// c_excl - номер вычёркиваемого столбца (< size!)
//
void make_minor(int **minor, int **src, int size, int r_excl, int c_excl) {
    for (int i = 0, iminor = 0; i < size; ++i) {
        if (i == r_excl)
            continue;
        for (int j = 0, jminor = 0; j < size; ++j) {
            if (j == c_excl)
                continue;
            minor[iminor][jminor] = src[i][j];
            ++jminor;
        }
        ++iminor;
    }
}
 
void dump_matrix(int **mat, int size) {
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            cout << setw(4) << mat[i][j];
        }
        cout << endl;
    }
}
 
int determinant(int **matrix, int k) {
 
    // а посмотреть как считает?
    //cout << "determinant() size = " << k << endl;
    //dump_matrix(matrix, k);
 
    if (k == 1) return matrix[0][0];
    if (k == 2) return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]; // частные случаи
 
    int det = 0;                             // сам определитель
 
    int **new_matrix = new int*[k - 1];      // создаем двухмерный массив для минора
    for (int i = 0; i < k - 1; i++) 
        new_matrix[i] = new int[k - 1];
 
    for (int l = 0; l < k; l++) {
        make_minor(new_matrix, matrix, k, 0, l);
        det += (l % 2 ? -1: 1) * matrix[0][l] * determinant(new_matrix, k - 1); // вычисляем определитель
    }
 
    // удаляем двухмерный массив минора
    for (int i = 0; i < k - 1; i++)
        delete[] new_matrix[i];
    delete[] new_matrix;
 
    return det;
}
 
int main() {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int n;
    cout << "Введите размер матрицы: ";
    cin >> n;
    int **matrix = new int*[n];
    for (int i = 0; i < n; i++) matrix[i] = new int[n];
    cout << "Введите матрицу: " << endl;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            //cin >> matrix[i][j];
            matrix[i][j] = rand() % 10 + 1;
 
    cout << "Принято:" << endl;
    dump_matrix(matrix, n);
 
    cout << "Определитель вашей матрицы равен ";
    cout << determinant(matrix, n) << endl;
 
    for (int i = 0; i < n; i++)
        delete[] matrix[i];
    delete[] matrix;
 
    return 0;
}
2
21.10.2018, 02:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.10.2018, 02:22
Помогаю со студенческими работами здесь

Вычислить определитель матрицы
Здравствуйте, уважаемые форумчане! Так получилось, что я снова решил пополнить свою коллекцию...

Найти определитель матрицы
помогите пожалуйста написать программу на Visual С++. чего только не пробовала, не получается:(

Рассчитать определитель матрицы
в файле test.in создать 2 матрицы , рассчитать их определитель и их результат записать в test.out

Определитель трехмерной матрицы
Как найти определитель трехмерной матрицы на C++


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru