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

Найти все миноры третьего порядка матрицы 5х5

09.02.2015, 00:22. Показов 6766. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
2. С клавиатуры пользователь задает матрицу 5х5. Найти все её миноры третьего порядка.

С этим заданием немного успешнее идет борьба. Есть функция находжения определителя (минора), с заполнением матрицы проблем также не возникло.
Не понимаю, каким образом получить все эти определители 3х3, каким образом перебрать все возможные варианты миноров.
Любая помощь будет кстати.
Спасибо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.02.2015, 00:22
Ответы с готовыми решениями:

нужно найти угловые миноры матрицы..
Помогите написать программу, которая будет определять есть ли у двух матриц (A и B) совпадающие угловые миноры.

Как вычислить определитель матрицы второго и третьего порядка матрицы А
Как вычислить определитель матрицы второго и третьего порядка матрицы А

Заданы матрицы А и В третьего порядка
Заданы матрицы А и В третьего порядка. Переменной S присвоить -1, если максимальный элемент матрицы А больше максимального ...

7
323 / 49 / 28
Регистрация: 07.09.2014
Сообщений: 217
09.02.2015, 17:40
Самый прямой вариант, это перебор в лоб. У вас есть матрица 5х5, чтобы получить из нее матрицу 3х3 нужно убрать 2 строки и 2 столбца. То есть получается что-то такого вида:

C++
1
2
3
4
5
6
7
8
9
10
for (int i1 = 0;i1 < 4;i1++){
     for (int i2 = i1 + 1;i2 < 5;i2++){
          for (int j1 = 0;j1 < 4;j1++){
               for (int j2 = j1 + 1;j2 < 5;j2++){
               //Здесь мы ищем определитель матрицы 3х3 которая получена из исходной
               //удалением строк i1,i2 и столбцов j1,j2
               }
          }
     }
}
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
09.02.2015, 18:03
Цитата Сообщение от TurbolenT Посмотреть сообщение
Не понимаю, каким образом получить все эти определители 3х3, каким образом перебрать все возможные варианты миноров.
Разве что все пары ячеек найти (не стоящих в одной линии). Пару ячеек находишь, вырезаешь и получаешь матрицу 3*3.
0
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 8
12.02.2015, 13:03  [ТС]
Вот, что получилось. Матрица заполняется пока что рандомно, но поменять это не составит труда. Кажется все работает

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
#include <iostream>
#include <conio.h>
#include <math.h>
#include <time.h>
 
using namespace std;
const int N(5);
int determinant(int a[3][3])
{
    int d = a[0][0] * a[1][1] * a[2][2] + a[0][1] * a[1][2] * a[2][0] + a[0][2] * a[1][0] * a[2][1]
        - a[0][2] * a[1][1] * a[2][0] - a[0][1] * a[1][0] * a[2][2] - a[0][0] * a[1][2] * a[2][1];
    return d;
}
 
void randomizer(int a[N][N])
{
    srand(time(NULL));
    for (int i(0); i < N; i++)
        for (int j(0); j < N; j++)
        {
            a[i][j] = rand()%10;
        }
}
 
void show_part_of_matrix(int a[3][3])
{
    for (int i(0); i < 3; i++){
        for (int j(0); j < 3; j++)
        {
            cout << a[i][j] << "\t";
        }
        cout << endl;
    }
    cout << endl << endl;
}
 
void show_full_matrix(int a[N][N])
{
    for (int i(0); i < N; i++){
        for (int j(0); j < N; j++)
        {
            cout << a[i][j] << "\t";
        }
        cout << endl;
    }
    cout << endl << endl;
}
 
int main(){
    int original_matrix[5][5];
    int temp_matrix[3][3];
    randomizer(original_matrix);
    show_full_matrix(original_matrix);
    cout << "-----------------------------" << endl;
    int m, k;
    m = k = 0;
    while (m < 3){
        k = 0;
        while (k < 3){
            for (int i(0); i < 3; i++){
                for (int j(0); j < 3; j++)
                {
                    temp_matrix[i][j] = original_matrix[i + m][j + k];
                }
            }
            cout << "-----------------------------" << endl;
            show_part_of_matrix(temp_matrix);
            cout << "Determinant: " << determinant(temp_matrix) << endl;
            k++;
        }
        m++;
    }
    _getch();
    return 0;
}
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
12.02.2015, 14:00
TurbolenT, Что-то мне не очень нравится твой перебор. Посмотри, сколько у тебя получается миноров. Должно быть C52*C52 = 100. Если у тебя получится меньше - ты не прав.
Цитата Сообщение от TurbolenT Посмотреть сообщение
каким образом перебрать все возможные варианты миноров.
Посмотри в сторону "Генерация сочетаний". Эта тема на форуме обсуждалась и решалась неоднократно. При любых значениях n, m она решается одним циклом (+ еще один внутренний)

Добавлено через 5 минут
Перебор mihey1993, (пост 2) мне кажется более точным. Но недостаток - если чуток изменить входные данные (скажем 6 х 6), код придется менять

Добавлено через 2 минуты
ЗЫ. Прямой подсчет определителя (без всяких там гауссов) - тоже переборная задача. Только там надо генировать перестановки (m!)
0
267 / 170 / 40
Регистрация: 25.08.2014
Сообщений: 1,087
Записей в блоге: 1
12.02.2015, 15:22
Цитата Сообщение от Байт Посмотреть сообщение
Прямой подсчет определителя (без всяких там гауссов) - тоже переборная задача.
Через миноры решается рекурсией.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
12.02.2015, 20:32
Цитата Сообщение от Enno Посмотреть сообщение
Через миноры решается рекурсией.
Да, можно и так. Вообще, известно, что любой итерационный алгоритм можно оформить в виде рекурсии, так и наоборот. Дело в удобстве (видении проблемы программистом) ну и в аппаратными ограничениях.
0
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 8
13.02.2015, 02:07  [ТС]
Вот оно. Наверное)

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
#include <iostream>
#include <conio.h>
#include <math.h>
#include <time.h>
#include <assert.h>
#include <fstream>
 
using namespace std;
const int N(5);
ofstream fout("output.txt", ios_base::trunc | ios_base::app);
int determinant(int a[3][3])
{
    int d = a[0][0] * a[1][1] * a[2][2] + a[0][1] * a[1][2] * a[2][0] + a[0][2] * a[1][0] * a[2][1]
        - a[0][2] * a[1][1] * a[2][0] - a[0][1] * a[1][0] * a[2][2] - a[0][0] * a[1][2] * a[2][1];
    return d;
}
 
void randomizer(int a[N][N])
{
    srand(time(NULL));
    for (int i(0); i < N; i++)
        for (int j(0); j < N; j++)
        {
        a[i][j] = rand() % 10;
        }
}
 
void filling_the_matrix(int a[N][N])
{
    for (int i(0); i < N; i++)
        for (int j(0); j < N; j++)
        {
        cout << "Matrix[" << i << "][" << j << "] = ";
        while (!(cin >> a[i][j]))
        {
            cin.clear();
            while (cin.get() != '\n');
        }
        }
}
 
void write_part_of_matrix(int a[3][3])
{
    for (int i(0); i < 3; i++){
        for (int j(0); j < 3; j++)
        {
            fout << a[i][j] << "\t";
        }
        fout << endl;
    }
    fout << endl << endl;
}
 
void show_full_matrix(int a[N][N])
{
    for (int i(0); i < N; i++){
        for (int j(0); j < N; j++)
        {
            cout << a[i][j] << "\t";
        }
        cout << endl;
    }
    cout << endl << endl;
}
 
bool get_next_combination(int *a, int k, int n)
{
    assert(a);
    if (k > n || k <= 0 || n <= 0)
        return false;
    int i = k - 1;
    int col = 0;
    while (i >= 0)
    {
        if (++a[i] <= n - col)
            break;
 
        --i;
        ++col;
    }
    if (i<0)
        return false;
    for (; i < k - 1; ++i)
    {
        a[i + 1] = a[i] + 1;
    }
    return true;
}
 
int main(){
    int original_matrix[5][5];
    int temp_matrix[3][3];
    int n(5), k(3);
    int temp_vector1[3];
    int temp_vector2[3];
    int count(0);
    char choice;
    bool choice_is_made = false;
    fout.open("output.txt", ios_base::trunc); 
    if (!fout.is_open())
    {
        cout << "Error! Program could not create or open file."; 
        return 1; 
    }
 
    do{
        cout << "Fill matrix randomly (r) or fill it by yourself (w)? \n";
            cin >> choice;
        switch (choice)
        {
        case 'r':
            choice_is_made = true;
            randomizer(original_matrix);
            break;
        case 'w':
            choice_is_made = true;
            filling_the_matrix(original_matrix);
            break;
        default:
            cout << "\nIncorrect choice!\n";
            break;
        }
    } while (choice_is_made != true);
    cout << endl;
    show_full_matrix(original_matrix);
    fout << "-----------------------------" << endl;
    for (int i = 0; i< k; ++i)
    {
        temp_vector1[i] = i + 1;
        temp_vector2[i] = i + 1;
    }
    do{
        do{
            for (int i(0); i < 3; i++){
                for (int j(0); j < 3; j++){
                    temp_matrix[i][j] = original_matrix[temp_vector1[i] - 1][temp_vector2[j] - 1];
                }
            }
            write_part_of_matrix(temp_matrix);
            fout << "Determinant: " << determinant(temp_matrix) << endl;
            fout << "-----------------------------" << endl;
            count++;
        }while(get_next_combination(temp_vector2, k, n));
        for (int i = 0; i< k; ++i)
        {
            temp_vector2[i] = i + 1;
        }
    } while(get_next_combination(temp_vector1, k, n));
fout << "Amount of matrix: " << count;
cout << "\nThe calculation is finished and was written in file output.txt";
 
 
    fout.close();
    _getch();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.02.2015, 02:07
Помогаю со студенческими работами здесь

Заданы матрицы А и В третьего порядка
Заданы матрицы А и В третьего порядка. Переменной S присвоить -1, если максимальный элемент матрицы А больше максимального элемента матрицы...

Вычислить определитель матрицы третьего порядка
1) вычислить с помощью с++ определитель матрицы третьего порядка. 2) вычислить для заданной матрицы второго порядка обратную ей матрицу. ...

Определитель квадратной матрицы третьего порядка
Написать программу, которая вычисляет определитель квадратной матрицы третьего порядка. P.S. С использованием массивов, наполнение...

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru