Форум программистов, компьютерный форум CyberForum.ru

Найти обратную матрицу и умножить ее на вектор - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Реализовать транслитерацию строки http://www.cyberforum.ru/cpp-beginners/thread188157.html
задача№1 Дан текст в строке.Сделать транслитерацию єтой строки. задача №2 дан текст строки. Если в строке больше одного знака арифметической операции, то уменьшить последовательность до одного.( например, 3+++++7 заменить на 3+7, если 3+ * 9 то оставить 3+*9)
C++ Ошибка в программе условие:Даны целые положительные числа N и K. Найти сумму 1K + 2K + … + NK. Чтобы избежать целочисленного переполнения, вычислять слагаемые этой суммы с помощью вещественной переменной и выводить результат как вещественное число.При этом использовать цикл FOR Программный код: int N, K, Sum = 0; Console.WriteLine("Введите N>0"); N =... http://www.cyberforum.ru/cpp-beginners/thread188154.html
Пожалуйста, подскажите свободный IDE с поддержкой DOS-кодировок... C++
Здравствуйте, уважаемые... С++ я знаю ненамного лучше, чем никак... Изредка пописываю элементарнейшие консольные программки под собственные нужды. Пописываю под Линуксом, но, порой, возникает необходимость и под Винду их пересобрать. Здесь и начинается проблема. С обеих сторон (как под Кубунтой, так и под XP) - CodeBlocks. Под Линуксом он создаёт файлы в ANSI, а после их сборки под Виндой -...
C++ удаление повторяющихся чисел в массиве
допустим есть массив a={1,1,1,1,54,84,63,554,54,85,32,84,1,2,6,85} нужно в массиве оставить все числа по одному экземпляру: a={1,54,84,63,554,85,32,2,6}
C++ Можете помочь объясните пожалуйста выделенный жирым шрифтом кусок кода..... http://www.cyberforum.ru/cpp-beginners/thread188126.html
Не жирным.....жирным не выделяется:) а с 49 по 59-ый??? Очень нужно.... #include <fstream> #include <stack> #include <sstream> #include<iostream> #include"car.h"
C++ строки файлы с С++ Добрый вечер уважаемые мастера С++. Помогите пожалуйста с написанием программки по С++. Программа должна считывать текст с первого файл(несколько строк) подсчитывать количество слов что заканчиваются на abc и выводить во второй файл кол. слов и строки что начинаются с знака "=" или " =". За ранее спасибо!!! подробнее

Показать сообщение отдельно
Ternsip
 Аватар для Ternsip
660 / 188 / 6
Регистрация: 10.05.2012
Сообщений: 595
07.05.2013, 21: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
76
77
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <stack>
#include <deque>
#include <set>
#include <string>
#include <limits>
#include <fstream>
 
using namespace std;
 
vector < vector <double> > inverse(vector < vector <double> > a) {
    int n = a.size();
    vector < vector <double> > ans(n, vector <double> (n, 0));  
    for (int i = 0; i < n; i++){
        ans[i][i] = 1.0;
    }  
    for (int i = 0; i < n; i++){
        int row = i;
        double mx = a[i][i];
        for(int k = i + 1; k < n; k++){
            if (abs(a[k][i]) > mx){
                row = k;
                mx = abs(a[k][i]);
            }
        }
        if (row != i) {
            swap(a[row], a[i]);
            swap(ans[row], ans[i]);
        }
        for (int j = i+1; j < n; j++){
            double e = a[j][i]/a[i][i];
            for (int k = 0; k < n; k++){
                a[j][k] -= e*a[i][k];
                ans[j][k] -= e*ans[i][k];
            }
        }
    }
    for (int i = n - 1; i >= 0; i--) {
        for (int j = i - 1; j >= 0; j--){
            double e = a[j][i]/a[i][i];
            for (int k = 0; k < n; k++){
                a[j][k] -= e*a[i][k];
                ans[j][k] -= e*ans[i][k];
            }
        }
        for (int j = 0; j < n; j++) {
            ans[i][j] /= a[i][i];
        }
    }
    return ans;
}
 
int main(){
    int n;
    cin >> n;
    vector < vector <double> > a(n, vector <double> (n, 0)), ans;
 
    for (int i = 0; i < n; i++){
        for (int j = 0; j < n; j++){
            scanf("%lf", &a[i][j]);
        }
    } 
 
    ans = inverse(a);
 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%.15lf ", ans[i][j]);
        }
        puts("");
    }
    return 0;
}
Добавлено через 5 минут
Обновил код

Добавлено через 34 минуты
Лично протестировал несколько матриц, всё сходилось. Особенно удобно проверять так : сделали матрицу, нашли обратную, затем нашли обратную к обратной и сверились.
 
Текущее время: 00:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru