Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/40: Рейтинг темы: голосов - 40, средняя оценка - 4.98
21 / 19 / 6
Регистрация: 25.11.2017
Сообщений: 708

Приведение матрицы к ступенчатому виду

01.03.2020, 14:32. Показов 8048. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
При приведении матрицы, когда на главной диагонали нули, то выдает ошибку деления на ноль. Как можно еще привести к ступенчатому виду?
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <cmath>
using namespace std;
 
int main()
{
    double mas[3][3] = {{0,90,123}, {30,0, 12}, {59, 125, 0}};
    int i = 0, j = 0;
    double temp = 0;
    for(int k = 0; k < 3; k++)
    {
        for(int i = k + 1; i < 3; i++)
    { 
        temp = mas[i][k] / mas[k][k];
        for(int j = 0; j < 3; j++)
        {
            mas[i][j] -= mas[k][j] * temp;
        }
 
    }
    }
    for(int i = 0; i < 3; i++)
    {
    for(int j = 0; j < 3; j++){
    cout << mas[i][j] << " " ;
    }
    cout << endl;
    }
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.03.2020, 14:32
Ответы с готовыми решениями:

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

Приведение матрицы к диагональному виду
Всем привет! Помогите решить задачку на с++: Привести матрицу n*n к диагональному виду, иллюстрируя каждый шаг. У меня получилось...

Приведение матрицы к блочно-диагональному виду
Помогите, пожалуйста! Так то надо написать программу на си++ &quot;Приведение матрицы к блочно-диагональному виду&quot; то есть когда все...

13
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
01.03.2020, 20:29
Цитата Сообщение от Andy_Coldfield Посмотреть сообщение
Как можно еще привести к ступенчатому виду?
https://www.intuit.ru/studies/... cture/1978
1
21 / 19 / 6
Регистрация: 25.11.2017
Сообщений: 708
02.03.2020, 09:50  [ТС]
oleg-m1973, я просто хотел сократить количество выполняемых операций и избавиться от эпсилон. Но как-то странно, вроде все логично, но к ступенчатому виду не приводит
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
02.03.2020, 10:12
Цитата Сообщение от Andy_Coldfield Посмотреть сообщение
oleg-m1973, я просто хотел сократить количество выполняемых операций и избавиться от эпсилон. Но как-то странно, вроде все логично, но к ступенчатому виду не приводит
Ну а что там должно быть, в случае нуля на диагонали, mas[k][k] == 0? Это уже математика, а не программирование
0
21 / 19 / 6
Регистрация: 25.11.2017
Сообщений: 708
05.03.2020, 18:56  [ТС]
oleg-m1973, а как матрицу бинарную привести к ступенчатому виду.... Я же не могу использовать деление. К примеру есть матрица

Добавлено через 1 минуту
https://www.cyberforum.ru/cgi-bin/latex.cgi?\begin{bmatrix} 0&  0&  1&  0&  0& 1&\\  0&  0&  1&  1&  1& 1&\\  1&  1&  0&  0&  0& 0&\\  0&  1&  0&  0&  0& 1&\\  0&  1&  0&  0&  0& 0&\\  1&  1&  0&  1&  0& 0&\\\end{bmatrix}

Добавлено через 46 минут
oleg-m1973, если это над полем из двух элементов...
0
21 / 19 / 6
Регистрация: 25.11.2017
Сообщений: 708
10.03.2020, 22:20  [ТС]
oleg-m1973,
Кликните здесь для просмотра всего текста
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
#include <iostream>
#define LENGTH 4
using namespace std;
 
int main()
{
    unsigned char l1[LENGTH][LENGTH] = { {1,1,0,0}, {0,0,1,0}, {1,0,1,1},{1,1,1,1} };
    for (int i = 0; i < LENGTH; i++)
        for (int j = 0; j < LENGTH; j++)
            if (j == 0) cout << endl << (int)l1[i][j] << " ";
            else cout << (int)l1[i][j] << " ";
            
            int i, k, j;
            for (i = 0; i < LENGTH; i++)
            {
                if (l1[i][i] == 1)
                {
                    for (k = i + 1; k < LENGTH; k++)
                    {
                        if (l1[k][i] == 1)
                        {
                            int count = 0;
                            while (count < LENGTH)
                            {
                                l1[k][count] = l1[k][count] ^ l1[i][count];
                                count++;
                            }
                        }
                    }
                } else {
                    int kk;
                    for (kk = i + 1; kk < LENGTH; kk++)
                    {
                        if (l1[kk][i] == 1)
                        {
                            int swap;
                            for (int kkk = 0; kkk < LENGTH; kkk++)
                            {
                                swap = l1[kk][kkk];
                                l1[kk][kkk] = l1[i][kkk];
                                l1[i][kkk] = swap;
                            }
                        }
                    }
                    for(k = i + 1; k < LENGTH; k++)
                        if (l1[i][i] == l1[k][i])
                        {
                            int count = 0;
                            while (count < LENGTH)
                            {
                                l1[k][count] = l1[k][count] ^ l1[i][i];
                                count++;
                            }
                        }
 
                
                }
        }
 
    return 0;
}

Не подскажешь, как можно уменьшить количество операций с циклами...
0
21 / 19 / 6
Регистрация: 25.11.2017
Сообщений: 708
13.03.2020, 00:12  [ТС]
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
int main()
{
    int temp;
    setlocale(LC_ALL, "rus");
 
    unsigned char l1[ROW * COLUMN] = {
        0, 0, 0, 1, 1, 1, 0, 1,
        1, 0, 0, 1, 1, 1, 0, 1,
        0, 1, 1, 1, 1, 0, 0, 0,
        1, 1, 1, 1, 1, 0, 1, 1,
        1, 1, 0, 0, 1, 1, 0, 1,
        0, 0, 0, 1, 1, 1, 1, 0,
        1, 0, 0, 1, 1, 0, 1, 1,
        1, 0, 1, 1, 0, 1, 1, 0
    };
    
    int i, j, rs2, row_start, tmp, k;
    for (i = 0; i < COLUMN; i++) {
        row_start = COLUMN * i;
        if (l1[row_start + i] == 0) {
            for (j = i + 1; j < ROW && l1[COLUMN * j + i] == 0; j++);
            if (j == ROW) break;
            rs2 = j*COLUMN;
            for (k = 0; k < COLUMN; k++) {
                tmp = l1[row_start + k];
                l1[row_start + k] = l1[rs2 + k];
                l1[rs2 + k] = tmp;
                
            }
            if (flags == 0) c++;
        }
        for (int t = 0; t < ROW; t++)
            for (int tt = 0; tt < COLUMN; tt++)
                if (tt == 0) cout << endl << (int)l1[t * COLUMN + tt] << " ";
                else cout << (int)l1[t * COLUMN + tt] << " ";
        cout << endl << "***********************" << endl;
        if (l1[i * COLUMN + i] == 1)
            {
                    for (int kkk = i + 1; kkk < ROW; kkk++)
                    {
                        if (l1[kkk * COLUMN + i] == 1)
                        {
                            int count = 0;
                            while (count < COLUMN)
                            {
                                l1[kkk * COLUMN + count] = l1[kkk * COLUMN + count] ^ l1[i * COLUMN + count];
                                count++;
                            }
                        }
                    }
             }
                for (int t = 0; t < ROW; t++)
                    for (int tt = 0; tt < COLUMN; tt++)
                        if (tt == 0) cout << endl << (int)l1[t * COLUMN + tt] << " ";
                        else cout << (int)l1[t * COLUMN + tt] << " ";
                        cout << endl << "***********************" << endl;
    }   return 0;
}
Помогите разобраться как правильно привести матрицу к треугольному виду....
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
13.03.2020, 00:18
Цитата Сообщение от Andy_Coldfield Посмотреть сообщение
* COLUMN + i]
вам самим приятно этот бред копипастить каждый раз? Как вы в нём сами-то разбираетесь? Или это не ваш код?
В общем-то банальный код по перестановке каких-то там строчек в матрице превратили в лютый треш.
0
21 / 19 / 6
Регистрация: 25.11.2017
Сообщений: 708
13.03.2020, 00:20  [ТС]
Kuzia domovenok, а что не так собственно? просто удобно через одномерный массив.

Добавлено через 58 секунд
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
int main()
{
    int temp;
    setlocale(LC_ALL, "rus");
 
    unsigned char l1[ROW * COLUMN] = {
        0, 0, 0, 1, 1, 1, 0, 1,
        1, 0, 0, 1, 1, 1, 0, 1,
        0, 1, 1, 1, 1, 0, 0, 0,
        1, 1, 1, 1, 1, 0, 1, 1,
        1, 1, 0, 0, 1, 1, 0, 1,
        0, 0, 0, 1, 1, 1, 1, 0,
        1, 0, 0, 1, 1, 0, 1, 1,
        1, 0, 1, 1, 0, 1, 1, 0
    };
    
    int i, j, rs2, row_start, tmp, k;
    for (i = 0; i < COLUMN; i++) {
        row_start = COLUMN * i;
        if (l1[row_start + i] == 0) {
            for (j = i + 1; j < ROW && l1[COLUMN * j + i] == 0; j++);
            if (j == ROW) break;
            rs2 = j*COLUMN;
            for (k = 0; k < COLUMN; k++) {
                tmp = l1[row_start + k];
                l1[row_start + k] = l1[rs2 + k];
                l1[rs2 + k] = tmp;
            }
        }
        for (int t = 0; t < ROW; t++)
            for (int tt = 0; tt < COLUMN; tt++)
                if (tt == 0) cout << endl << (int)l1[t * COLUMN + tt] << " ";
                else cout << (int)l1[t * COLUMN + tt] << " ";
        cout << endl << "***********************" << endl;
        if (l1[i * COLUMN + i] == 1)
            {
                    for (int kkk = i + 1; kkk < ROW; kkk++)
                    {
                        if (l1[kkk * COLUMN + i] == 1)
                        {
                            int count = 0;
                            while (count < COLUMN)
                            {
                                l1[kkk * COLUMN + count] = l1[kkk * COLUMN + count] ^ l1[i * COLUMN + count];
                                count++;
                            }
                        }
                    }
             }
                for (int t = 0; t < ROW; t++)
                    for (int tt = 0; tt < COLUMN; tt++)
                        if (tt == 0) cout << endl << (int)l1[t * COLUMN + tt] << " ";
                        else cout << (int)l1[t * COLUMN + tt] << " ";
                        cout << endl << "***********************" << endl;
    }   return 0;
}
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
13.03.2020, 00:30
действительно, зачем программисты вообще абстракции придумали? Можно же всё в одну кучу свалить!
Весь код - в мейн,
все данные в одномерный массив,
переменные назовём kkk и ttt
мало иметь весь код в мейне. надо побольше выражений в одну строчку и пустых циклов на точку с запятой,
в целях оптимизации памяти все intы храним как unsigned char
Ну чтоб народ не подумал, что писатель - ламер какой-то, чтоб видели, что он сложный код писать умеет, да?
0
21 / 19 / 6
Регистрация: 25.11.2017
Сообщений: 708
13.03.2020, 00:46  [ТС]
Kuzia domovenok, там не такой большой код, чтоб разбрасывать по функциям. и выделять для этого память. Вот без пустого цикла
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
int main()
{
    int temp;
    setlocale(LC_ALL, "rus");
 
    unsigned char l1[ROW * COLUMN] = {
        0, 0, 0, 1, 1, 1, 0, 1,
        1, 0, 0, 1, 1, 1, 0, 1,
        0, 1, 1, 1, 1, 0, 0, 0,
        1, 1, 1, 1, 1, 0, 1, 1,
        1, 1, 0, 0, 1, 1, 0, 1,
        0, 0, 0, 1, 1, 1, 1, 0,
        1, 0, 0, 1, 1, 0, 1, 1,
        1, 0, 1, 1, 0, 1, 1, 0
    };
    
    int i, j, rs2, row_start, tmp, k, flags = 0, c = 0;
    for (i = 0; i < COLUMN; i++) {
        row_start = COLUMN * i;
        if (l1[row_start + i] == 0) {
            for (j = i + 1; j < ROW; j++) {
                rs2 = j*COLUMN;
                if (l1[row_start + i] < l1[rs2 + i]) {
                    for (k = 0; k < COLUMN; k++) {
                        tmp = l1[row_start + k];
                        l1[row_start + k] = l1[rs2 + k];
                        l1[rs2 + k] = tmp;
                    }
                }
            }
        }
        for (int t = 0; t < ROW; t++)
            for (int tt = 0; tt < COLUMN; tt++)
                if (tt == 0) cout << endl << (int)l1[t * COLUMN + tt] << " ";
                else cout << (int)l1[t * COLUMN + tt] << " ";
                cout << endl << "***********************" << endl;
                if (l1[i * COLUMN + i] == 1)
                {
                    for (int kkk = i + 1; kkk < ROW; kkk++)
                    {
                        if (l1[kkk * COLUMN + i] == 1)
                        {
                            int count = 0;
                            while (count < COLUMN)
                            {
                                l1[kkk * COLUMN + count] = l1[kkk * COLUMN + count] ^ l1[i * COLUMN + count];
                                count++;
                            }
                        }
                    }
                }
    
                for (int t = 0; t < ROW; t++)
                    for (int tt = 0; tt < COLUMN; tt++)
                        if (tt == 0) cout << endl << (int)l1[t * COLUMN + tt] << " ";
                        else cout << (int)l1[t * COLUMN + tt] << " ";
                        cout << endl << "***********************" << endl;
    }   return 0;
}
Буду признателен, если дадите совет с более корректным алгоритмом или подскажите в чем у меня ошибка...
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
13.03.2020, 01:09
Цитата Сообщение от Andy_Coldfield Посмотреть сообщение
уду признателен, если дадите совет с более корректным алгоритмом или подскажите в чем у меня ошибка...
Ну перед каждым шагом выбирать в качестве ведущей строку с масимальным модулем. Т.е. нашли максимальный модуль в первом столбце. поставили эту строку первой. Обработали строки с 1 по n. и так далее в миноре с вычеркнутой первой строкой и столбцом пока до конца не найдете. Если на очередном шаге максимум окажется 0 то ранг матрицы ниже ее размера и система имеет бесконечное множество решений.
0
21 / 19 / 6
Регистрация: 25.11.2017
Сообщений: 708
13.03.2020, 14:06  [ТС]
Fulcrum_013, а можно у меня в коде правочки внести... Пожалуйста
0
21 / 19 / 6
Регистрация: 25.11.2017
Сообщений: 708
14.03.2020, 16:53  [ТС]
Kuzia domovenok,
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
int main()
{
 
    unsigned char l1[ROW][COLUMN] = {
        {1, 0, 1, 1},
        {0, 1, 0, 1},
        {0, 1, 1, 0},
        {1, 0, 1, 1}
    };
    unsigned int v;
    
    
    for (int r = 0, l = 0, i, j, im; r < ROW, l < COLUMN; l++)
    {
        for (i = r; i < ROW; i++)
        {
            if (l1[i][l] == 1)
                im = i;
        }
 
        if (im != 0)
        {
            for (j = 0; j < COLUMN; j++)
            {
                v = l1[im][j];
                l1[im][j] = l1[r][j];
                l1[r][j] = v;
            }
            cout << "Checkpoint" << endl;
        }
        for (int kk = r + 1; kk < ROW; kk++)
        {
            if (l1[kk][l] == 1)
            {
                for (int kkk = 0; kkk < COLUMN; kkk++) l1[kk][kkk] = l1[kk][kkk] ^ l1[r][kkk];
            }
        }
        cout << "Checkpoint" << endl;
        if (im != 0) r++;
    }
 
    return 0;
}
Вроде бы правильно получилось, но вот правда порядок следования...

Добавлено через 19 минут
Kuzia domovenok, все отредактировал. И вроде как получилось))) Работает и приводит к ступенчатому виду))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.03.2020, 16:53
Помогаю со студенческими работами здесь

Реализация метода Гаусса: приведение матрицы к треугольному виду
Ребят, помогите с кусочком программы реализации метода Гаусса. мне нужно приведение матрицы к треугольному виду. Заранее спасибо

Приведение матрицы к треугольному виду: вызвано исключение нарушение доступа для чтения
Программа обрабатывает двумерный массив, на стадии приведения матрицы к треугольному виду выдает ошибку. исключение ставит на 62 строке. ...

Программа, приводящая матрицу к ступенчатому виду
Не подскажите, где накосячил в программе? #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;locale.h&gt; #include &lt;math.h&gt; ...

Привести лямбда матрицу к ступенчатому виду
Нужна помощь в приведении матрицы к ступенчатому виду:

Приведение матрицы к треугольному виду
задать матрицу вывести матрицу привести к треугольному виду выводим обратный ход


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru