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

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

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

Студворк — интернет-сервис помощи студентам
Добрый день.Проблема в том,что при 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)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.10.2018, 22:23
Ответы с готовыми решениями:

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

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

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

2
Диссидент
Эксперт C
 Аватар для Байт
27712 / 17330 / 3810
Регистрация: 24.12.2010
Сообщений: 38,979
20.10.2018, 22:44
Цитата Сообщение от Gaveyn Посмотреть сообщение
в чем проблема понять не могу
Скорее всего, переполнение стека.
0
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
21.10.2018, 02:22
Лучший ответ Сообщение было отмечено 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.10.2018, 02:22
Помогаю со студенческими работами здесь

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

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

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

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

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


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

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

Новые блоги и статьи
Мастер-класс по микросервисам на Node.js
Reangularity 21.06.2025
Node. js стал одной из самых популярных платформ для микросервисной архитектуры не случайно. Его неблокирующая однопоточная модель и событийно-ориентированный подход делают его идеальным для. . .
Управление Arduino из WPF приложения
Wired 21.06.2025
Зачем вообще связывать Arduino с WPF-приложением? Казалось бы, у Arduino есть собственная среда разработки, своя экосистема, свои способы управления. Однако при создании серьезных проектов. . .
Звёздная пыль
kumehtar 20.06.2025
Я просто это себе представляю: как создавался этот мир. Как энергия слипалась в маленькие частички. Как они собирались в первые звёзды, как во вселенной впервые появился Свет. Как эти звёзды. . .
Создание нейросети с PyTorch
AI_Generated 19.06.2025
Ключевое преимущество PyTorch — его питоновская натура. В отличие от TensorFlow, который изначально был построен как статический вычислительный граф, PyTorch предлагает динамический подход. Это. . .
JWT аутентификация в ASP.NET Core
UnmanagedCoder 18.06.2025
Разрабатывая веб-приложения, я постоянно сталкиваюсь с дилеммой: как обеспечить надежную аутентификацию пользователей без ущерба для производительности и масштабируемости? Классические подходы на. . .
Краткий курс по С#
aaLeXAA 18.06.2025
Здесь вы найдете все необходимые функции чтоб написать програму на C# Задание 1: КЛАСС FORM 1 public partial class Form1 : Form { Spisok listin = new Spisok(); . . .
50 самых полезных примеров кода Python для частых задач
py-thonny 17.06.2025
Эффективность работы разработчика часто измеряется не количеством написаных строк, а скоростью решения задач. Готовые сниппеты значительно ускоряют разработку, помогают избежать типичных ошибок и. . .
C# и продвинутые приемы работы с БД
stackOverflow 17.06.2025
Каждый . NET разработчик рано или поздно сталкивается с ситуацией, когда привычные методы работы с базами данных превращаются в источник бессонных ночей. Я сам неоднократно попадал в такие ситуации,. . .
Angular: Вопросы и ответы на собеседовании
Reangularity 15.06.2025
Готовишься к техническому интервью по Angular? Я собрал самые распространенные вопросы, с которыми сталкиваются разработчики на собеседованиях в этом году. От базовых концепций до продвинутых. . .
Архитектура Onion в ASP.NET Core MVC
stackOverflow 15.06.2025
Что такое эта "луковая" архитектура? Термин предложил Джеффри Палермо (Jeffrey Palermo) в 2008 году, и с тех пор подход только набирал обороты. Суть проста - представьте себе лук с его. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru