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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
xsergx
Сообщений: n/a
08.01.2011, 18:03     Определитель матрицы #1
Не могу написать код реккурсивной ф-ии на С для подсчёта опредилителя матрцы nxn, помогите кто чем может: или кодом или алгоритмам зарание благодарю
P.S. использовать реккурсию
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
08.01.2011, 23:43     Определитель матрицы #2
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
#include <vector>
#include <algorithm>
#include <fstream>
#include <iterator>
#include <iostream>
#include <conio.h>
 
using namespace std;
 
class nulled : public unary_function<vector<double>, bool>
{
public:
    bool operator() (const vector<double>& Buffer)
    {
        return !(*Buffer.begin());
    }
};
 
class chg : public binary_function<vector<double>, vector<double>, bool>
{
public:
    bool operator()(const vector<double>& Buffer1, const vector<double>& Buffer2)
    {
        return *Buffer1.begin() > *Buffer2.begin();
    }
};
 
class chg2 : public binary_function<vector<double>, vector<double>, bool>
{
public:
    bool operator()(const vector<double>& Buffer1, const vector<double>& Buffer2)
    {
        return *Buffer1.begin() < *Buffer2.begin();
    }
};
 
void out(vector<vector<double> >& Buffer)
{
    cout << endl;
    for (vector<vector<double> >::iterator i = Buffer.begin(), end = Buffer.end(); i != end; ++i, cout << endl)
        copy(i->begin(), i->end(), ostream_iterator<double>(cout, "  "));
}
 
double Determinant(vector<vector<double> >& Buffer)
{
    sort(Buffer.begin(), Buffer.end(), chg2()); 
    if (all_of(Buffer.begin(), Buffer.end(), nulled()))
        return 0;
    vector<vector<double> >::iterator fisrt = Buffer.begin();
    if (Buffer.size() == 1)
        return *fisrt->begin();
    for (vector<vector<double> >::iterator i = Buffer.begin() + 1, end = Buffer.end(); i != end; ++i)
    {
        double T = *i->begin() / *fisrt->begin(); 
        transform(fisrt->begin(), fisrt->end(), i->begin(), i->begin(),
        [&T](const double& value1, const double& value2)->double
        {
            return value2 - value1 * T;
        });
    }
    sort(Buffer.begin() + 1, Buffer.end(), chg());  
    vector<vector<double> > matrix(Buffer.size() - 1);
    for (vector<vector<double> >::iterator i = Buffer.begin() + 1, end = Buffer.end(), Tmp = matrix.begin(); i != end; ++i)
        copy(i->begin() + 1, i->end(), back_inserter(*Tmp++));
    return *fisrt->begin() * Determinant(matrix);
}
 
int main()
{
    fstream file("test.txt");
    size_t n; 
    file >> n;
    vector<vector<double> > matrix(n, vector<double>(n));
    for (vector<vector<double> >::iterator i = matrix.begin(), end = matrix.end(); i != end; ++i)
        for (vector<double>::iterator j = i->begin(), end = i->end(); j != end; ++j)
            file >> *j;
    cout << "Determinate \n" << static_cast<int>(Determinant(matrix));
    _getch();
    return EXIT_SUCCESS;
}

Не по теме:

вот только попробуйте спасибо не нажать!)

asics
08.01.2011, 23:53
  #3

Не по теме:

sandye51, Ну думаю что нажмет причина -

Цитата Сообщение от xsergx Посмотреть сообщение
код реккурсивной ф-ии на С

sandye51
09.01.2011, 00:11
  #4

Не по теме:

asics, мля, как всегда не обратил внимания
и так все красиво получилось...

silent_1991
09.01.2011, 17:19
  #5

Не по теме:

sandye51, а зачем определитель к int преобразовываете?))

sandye51
09.01.2011, 17:24     Определитель матрицы
  #6

Не по теме:

silent_1991, ну я как бы писал значально вообще для целых типов) а т.к. приходилось делить, то предпочел double .. но определитель целочисленной матрицы - есть целое число
ну да, в принципе для произвольных типов это нужно убрать)

Yandex
Объявления
09.01.2011, 17:24     Определитель матрицы
Ответ Создать тему
Опции темы

Текущее время: 12:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru