0 / 0 / 0
Регистрация: 12.03.2020
Сообщений: 17
1

Матрица. Исключение

17.03.2020, 20:48. Показов 1401. Ответов 9
Метки нет (Все метки)

Требуется найти обратную матрицу, для матрицы считываемой с файла
Обратная ищется по г-су

обратная матрица:
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
std::vector<std::vector<double>> Matrix::inverse(std::vector<std::vector<double>> matrix)
{
    std::vector <std:: vector <double>> matrix1(a, std::vector<double>(2*b));
    double r;
    double g;
    for (int i = 0; i < a; i++)
    {
        for (int j = 0; j <2* b; j++)
        {
            matrix1[i][j]=matrix[i][j];
        }
    }
    for (int i = 0; i < a; i++)
    {
        for (int j = 0; j < 2 * b; j++)
        {
            if (i == (j - a))
                matrix1[i][j] = 1;
            else
                matrix1[i][j] = 0;
        }
}
    for (int i = 0; i < a; i++)
    {
        for (int j = 0; j < b; j++)
        {
            if (i != j)
            {
                r = matrix1[j][i] / matrix1[i][i];
                for (int k = 0; k < 2 * b; k++)
                {
                    matrix1[j][k] =- r * matrix1[i][k];
                }
            }
        }
    }
    for (int i = 0; i < a; i++)
    {
        g = matrix1[i][i];
        for (int j = 0; j < 2 * b; j++)
        {
            matrix1[i][j] /= g;
        }
    }
    for (int i = 0; i < a; i++)
    {
        for (int j = b; j < 2 * b; j++)
        {
            std::cout << std::fixed << std::setprecision(4) << matrix1[i][j] << "\t";
            //std::cout << "\n";
        }
        std::cout << "\n";
    }
    return matrix1;
}
получение размера матрицы из файла
C++
1
2
3
4
5
std::vector<std::vector<double>> Matrix::razmer(std::vector < std::vector <double>> matrix) {
    a = matrix.size();
    b = matrix.size();
    return matrix;
}
При отладке возникает исключение "выход за границы вектора"

либо же матрица из "Not a number"

Подозреваю, что дело в добавлении единичной матрицы к исходной
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.03.2020, 20:48
Ответы с готовыми решениями:

Класс матрица. Вызвано исключение: нарушение доступа для чтения
Добрый день. При создании класса Matrix возникли проблемы в методе show. При отладке выпадает вот...

Возникло необработанное исключение по адресу 0x73A62CF2: исключение Microsoft C++: std::bad_array_new_length
Доброго времени суток, уважаемые форумчане :) Подскажите начинающему программисту. Ругается на...

Что я сделал не так?Возникло необработанное исключение по адресу 0x7434A9F2 : исключение Microsoft C++: std
//Калькулятор Intrigger #include&lt;iostream&gt; #include&lt;conio.h&gt; #include&lt;string.h&gt; ...

Исключение EOleError. Как перехватить при удалении записи это исключение ?
Добрый день, Господа. Связал ключем справочник с майн-таблицей на уровне СУБД MySQL. При...

9
nd2
3433 / 2812 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
17.03.2020, 21:40 2
Цитата Сообщение от makkkksss Посмотреть сообщение
При отладке возникает исключение "выход за границы вектора"
Найди место в коде, где вылетает, посмотри, что там с векторами и с индексами.
0
0 / 0 / 0
Регистрация: 12.03.2020
Сообщений: 17
17.03.2020, 22:12  [ТС] 3
nd2, матрица (matrix1) , в которую по идеи должна копироваться исходная заполняется нулями
0
6574 / 4559 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
17.03.2020, 22:19 4
Цитата Сообщение от makkkksss Посмотреть сообщение
При отладке возникает исключение "выход за границы вектора"
У тебя a == b? Если нет, то ты частенько путаешь индексы:
Цитата Сообщение от makkkksss Посмотреть сообщение
r = matrix1[j][i] / matrix1[i][i];
Цитата Сообщение от makkkksss Посмотреть сообщение
g = matrix1[i][i];
Цитата Сообщение от makkkksss Посмотреть сообщение
matrix1[j][k] =- r * matrix1[i][k];
Первй индекс должен быть меньше a, второй - меньше 2b
0
0 / 0 / 0
Регистрация: 12.03.2020
Сообщений: 17
18.03.2020, 06:15  [ТС] 5
oleg-m1973, да, матрица квадратная
0
Модератор
Эксперт С++
12631 / 10128 / 6098
Регистрация: 18.12.2011
Сообщений: 27,159
18.03.2020, 07:39 6
Цитата Сообщение от makkkksss Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
for (int i = 0; i < a; i++)
{
    for (int j = 0; j < 2 * b; j++)
    {
       if (i == (j - a))
           matrix1[i][j] = 1;
       else
           matrix1[i][j] = 0;
    }
}
Очень странное действие - удаление всего, что в матрице было и замена на нули и единицы
Прибавление единичной матрицы:
C++
1
2
for (int i = 0; i < a; i++)
    matrix1[i][i] += 1;
И, в целом, я не понимаю: зачем у Вас к матрице размером [a][a] справа прилеплена матрица размером [a][2b-a]
0
0 / 0 / 0
Регистрация: 12.03.2020
Сообщений: 17
18.03.2020, 09:01  [ТС] 7
zss, b на случай если матрица не квадратная. Ну следуя методу, справа и должна быть прилеплена единичная матрица.
и матрица имеет размер [a][2b]
Миниатюры
Матрица. Исключение  
0
Модератор
Эксперт С++
12631 / 10128 / 6098
Регистрация: 18.12.2011
Сообщений: 27,159
18.03.2020, 10:44 8
Ну, тогда надо было не всю матрицу обнулять, а только правую часть
C++
1
2
3
4
5
6
7
8
9
10
for (int i = 0; i < a; i++)
    {
        for (int j = b; j < 2 * b; j++) //  j=b  !!!!!!!!!!!!!!!!
        {
            if (i == (j - a))
                matrix1[i][j] = 1;
            else
                matrix1[i][j] = 0;
        }
}
0
0 / 0 / 0
Регистрация: 12.03.2020
Сообщений: 17
18.03.2020, 11:27  [ТС] 9
обр. матрица считается по гаусу

как вывести только обратную матрицу без единичной ?

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
std::vector<std::vector<double>> Matrix::inverse(std::vector<std::vector<double>> matrix)
{
    std::vector <std::vector <double>> matrix1(a, std::vector<double>(2 * b));
    float temp;
    for (int i = 0; i < a; i++)
    {
        for (int j = 0; j < b; j++)
        {
            matrix1[i][j] = matrix[i][j];
        }
    }
    for (int i = 0; i < a; i++)
    {
        for (int j = 0; j < 2 * b; j++)
        {
            if ((i+a) == j)
                matrix1[i][j] = 1;
        }
    }
    for (int i = a - 1; i > 0; i--) {
        if (matrix1[i - 1][0] < matrix1[i][0]) {
            for (int j = 0; j < 2 * b; j++) {
                temp = matrix1[i][j];
                matrix1[i][j] = matrix1[i - 1][j];
                matrix1[i - 1][j] = temp;
            }
        }
    }
    for (int i = 0; i < a; i++) {
        for (int j = 0; j < b; j++) {
            if (j != i) {
                temp = matrix1[j][i] / matrix1[i][i];
                for (int k = 0; k < 2 * b; k++) {
                    matrix1[j][k] -= matrix1[i][k] * temp;  }
            }
        }
}
    for (int i = 0; i < a; i++) {
        temp = matrix1[i][i];
 
        for (int j = 0; j < 2* b; j++) {
            matrix1[i][j] = matrix1[i][j]/temp;
        }
}
    for (int i = 0; i < a; i++) {
        for (int j = 0; j <  2*b; j++) {    //[COLOR="Red"]ЕСЛИ ЗДЕСЬ ОСТАВИТЬ просто b , то выводится только единичная [/COLOR]
            std::cout << std::fixed << std::setprecision(4) << matrix1[i][j] << "\t";
        }
        std::cout << std::endl;
 
    }
    return matrix1;
Миниатюры
Матрица. Исключение   Матрица. Исключение  
0
Модератор
Эксперт С++
12631 / 10128 / 6098
Регистрация: 18.12.2011
Сообщений: 27,159
18.03.2020, 11:36 10
Лучший ответ Сообщение было отмечено makkkksss как решение

Решение

Цитата Сообщение от makkkksss Посмотреть сообщение
for (int j = 0; j < 2*b; j++) {
C++
1
for (int j = 0; j < b; j++) { // для вывода левой половины
C++
1
for (int j = b; j < 2*b; j++) { // для вывода правой половины
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.03.2020, 11:36
Помогаю со студенческими работами здесь

Explorer.exe Исключение неизвестное программное исключение в Windows XP, что делать?
Уже три месяца борюсь с ужасной заразой, всякий раз, когда я совершаю какое-либо действие, будь...

прохожу исключение не могу понять где ошибка. мне нужно сделать свое исключение
import java.io.*; public class student { public static void main(String args){ ...

Программа выдает исключение: Вызвано исключение: нарушение доступа для чтения. _Pnext было 0xCCCCCCD0
Доброго времени суток. Пишу игру с помощью SFML, и при внедрении события нажатии кнопки Tab...

Avastscv.exe исключение программное исключение 0хс0000417
При загрузке виндовс вылазит ошибка указана в теме сообщения, и при этом антивирусник аваст...

Дана квадратная матрица А порядка n. Проверить, является ли матрица единичной.
Ребят,помогите решить задачу &quot;Дана квадратная матрица А порядка n. Проверить, является ли матрица...

Дана квадратная матрица А порядка n. Проверьте, является ли матрица единичной
Дана квадратная матрица А порядка n. Проверьте, является ли матрица единичной. Описать с помощью...


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

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

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