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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 189, средняя оценка - 4.98
kursant
1 / 1 / 0
Регистрация: 31.01.2010
Сообщений: 61
#1

Нужен пример нахождения определителя матрицы - C++

16.02.2010, 19:14. Просмотров 25001. Ответов 11
Метки нет (Все метки)

Подскажите пожалуйста простенький пример нахождения определителя матрицы?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2010, 19:14     Нужен пример нахождения определителя матрицы
Посмотрите здесь:
Формула для нахождения определителя матрицы C++
C++ Функция нахождения определителя матрицы с вычислением времени
Написать функцию для нахождения определителя квадратной матрицы C++
Код для нахождения определителя матрицы N на N исключением строки и столбца C++
Реализовать функцию нахождения определителя квадратной матрицы заданного размера C++
И снова класс Матрицы с функция-член класса для нахождения определителя C++
C++ Нужен пример вычисления матрицы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Qwerty_coder
29 / 29 / 2
Регистрация: 14.12.2009
Сообщений: 79
16.02.2010, 19:18     Нужен пример нахождения определителя матрицы #2
kursant,
Тут глянь:
http://www.cyberforum.ru/cpp/thread3119.html
kursant
1 / 1 / 0
Регистрация: 31.01.2010
Сообщений: 61
16.02.2010, 19:25  [ТС]     Нужен пример нахождения определителя матрицы #3
А не методом Гауса есть?
Omlet
28 / 7 / 1
Регистрация: 07.04.2010
Сообщений: 3
18.04.2010, 13:50     Нужен пример нахождения определителя матрицы #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вчера написал. Программа считает определитель квадратной матрицы NxN методом Гауса:

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
#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<stdlib.h>
#define NN 6
 
main()
{
clrscr();
 
float a[NN][NN],kst;
int i,j,n,p,k=0,t;
char yn;
 
// <----Ввод размера квадратной матрицы---->
 
while(k==0)
{
printf("\nВведите размер матрицы (от 2 до %d): N=",NN);
n=getche()-48;
if ((n<2) || (n>NN)) k=0;
else k=1;
}
 
// <----Ввод матрицы a[NN][NN]---->
 
k=0;
while(k==0)
{
printf("\n\nЗадать матрицу случайно? y/n: ");
yn=getche();
if ((yn=='y') || (yn=='n')) k=1;
else k=0;
}
switch(yn)
{
case 'y': for(i=0;i<n;i++) for(j=0;j<n;j++) a[i][j]=rand()%100;break;
default:
{
printf("\nВведите матрицу %dx%d\n",n,n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%f",&a[i][j]);
}
break;
}
 
 
// <----Выводим введенную матрицу---->
printf("\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++) printf("%6.2f\t",a[i][j]);
printf("\n\n");
}
 
// <----Считаем определитель---->
 
p=0;
for (i=0; i<n-1; i++)
{
t=1;
while(a[i][i]==0)
{
for(j=0; j<n; j++)
{
a[i][j]=kst;
a[i][j]=a[i+t][j];
a[i+t][j]=kst;
}
p++;
t++;
}
 
for (k=i+1; k<n; k++)
{
kst=a[k][i]/a[i][i];
for(j=0; j<n; j++)
a[k][j]-=a[i][j]*kst;
}
}
 
kst=pow(-1,p);
for(i=0; i<n; i++)
kst*=a[i][i];
 
printf("Определитель равен: %14.3f",kst);
getch();
}
Изначально требовалось найти минор матрицы. Сама программа:

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
#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<stdlib.h>
#define NN 6
 
main()
{
clrscr();
 
float a[NN][NN],kst;
int i,j,n,im,jm,p,k=0,t;
char yn;
 
// <----Ввод размера квадратной матрицы---->
 
while(k==0)
{
printf("\nВведите размер матрицы (от 2 до %d): N=",NN);
n=getche()-48;
if ((n<2) || (n>NN)) k=0;
else k=1;
}
 
// <----Ввод матрицы a[NN][NN]---->
 
k=0;
while(k==0)
{
printf("\n\nЗадать матрицу случайно? y/n: ");
yn=getche();
if ((yn=='y') || (yn=='n')) k=1;
else k=0;
}
switch(yn)
{
case 'y': for(i=0;i<n;i++) for(j=0;j<n;j++) a[i][j]=rand()%100;break;
default:
{
printf("\nВведите матрицу %dx%d\n",n,n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%f",&a[i][j]);
}
break;
}
 
 
// <----Выводим введенную матрицу---->
printf("\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++) printf("%6.2f\t",a[i][j]);
printf("\n\n");
}
 
// <----Вводим минор---->
printf("По какому элементу искать минор? i=");
im=getche()-49;
printf(" j=");
jm=getche()-49;
 
// <----Считаем матрицу минора---->
 
for (i=0; i<n; i++)
if(i==im) for(p=i; p<n; p++) for(j=0; j<n; j++) a[p][j]=a[p+1][j];
for (j=0; j<n; j++)
if(j==jm) for(p=j; p<n; p++) for(i=0; i<n; i++) a[i][p]=a[i][p+1];
n-=1;
 
// <----Выводим матрицу минора---->
printf("\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++) printf("%6.2f\t",a[i][j]);
printf("\n\n");
}
 
// <----Считаем минор---->
 
p=0;
for (i=0; i<n-1; i++)
{
t=1;
while(a[i][i]==0)
{
for(j=0; j<n; j++)
{
a[i][j]=kst;
a[i][j]=a[i+t][j];
a[i+t][j]=kst;
}
p++;
t++;
}
 
for (k=i+1; k<n; k++)
{
kst=a[k][i]/a[i][i];
for(j=0; j<n; j++)
a[k][j]-=a[i][j]*kst;
}
}
 
kst=pow(-1,p);
for(i=0; i<n; i++)
kst*=a[i][i];
 
printf("Минор по А[%d][%d] равен: %14.3f",im+1,jm+1,kst);
getch();
}
Может кому и пригодится.
OffyGhost
7 / 7 / 1
Регистрация: 04.03.2010
Сообщений: 107
23.02.2011, 15:33     Нужен пример нахождения определителя матрицы #5
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
#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<stdlib.h>
#define NN 6
 
void main()
{
 
float a[NN][NN],kst;
int i,j,n,p,k=0,t;
char yn;
 
// <----Ввод размера квадратной матрицы---->
 
while(k==0)
{
printf("\nВведите размер матрицы (от 2 до %d): N=",NN);
n=getche()-48;
if ((n<2) || (n>NN)) k=0;
else k=1;
}
 
// <----Ввод матрицы a[NN][NN]---->
 
k=0;
while(k==0)
{
printf("\n\nЗадать матрицу случайно? y/n: ");
yn=getche();
if ((yn=='y') || (yn=='n')) k=1;
else k=0;
}
switch(yn)
{
case 'y': for(i=0;i<n;i++) for(j=0;j<n;j++) a[i][j]=rand()%100;break;
default:
{
printf("\nВведите матрицу %dx%d\n",n,n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%f",&a[i][j]);
}
break;
}
 
 
// <----Выводим введенную матрицу---->
printf("\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++) printf("%6.2f\t",a[i][j]);
printf("\n\n");
}
 
// <----Считаем определитель---->
 
p=0;
for (i=0; i<n-1; i++)
{
t=1;
while(a[i][i]==0)
{
for(j=0; j<n; j++)
{
a[i][j]=kst;
a[i][j]=a[i+t][j];
a[i+t][j]=kst;
}
p++;
t++;
}
 
for (k=i+1; k<n; k++)
{
kst=a[k][i]/a[i][i];
for(j=0; j<n; j++)
a[k][j]-=a[i][j]*kst;
}
}
 
kst=pow(-1,p);
for(i=0; i<n; i++)
kst*=a[i][i];
 
printf("Определитель равен: %14.3f",kst);
getch();
}
1>------ Build started: Project: det, Configuration: Debug Win32 ------
1>Compiling...
1>lab1.cpp
1>c:\documents and settings\admin\my documents\visual studio 2008\projects\det\det\lab1.cpp(19) : warning C4996: 'getche': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getche. See online help for details.
1> c:\program files\microsoft visual studio 9.0\vc\include\conio.h(146) : see declaration of 'getche'
1>c:\documents and settings\admin\my documents\visual studio 2008\projects\det\det\lab1.cpp(30) : warning C4996: 'getche': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _getche. See online help for details.
1> c:\program files\microsoft visual studio 9.0\vc\include\conio.h(146) : see declaration of 'getche'
1>c:\documents and settings\admin\my documents\visual studio 2008\projects\det\det\lab1.cpp(36) : warning C4244: '=' : conversion from 'int' to 'float', possible loss of data
1>c:\documents and settings\admin\my documents\visual studio 2008\projects\det\det\lab1.cpp(42) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> c:\program files\microsoft visual studio 9.0\vc\include\stdio.h(306) : see declaration of 'scanf'
1>c:\documents and settings\admin\my documents\visual studio 2008\projects\det\det\lab1.cpp(82) : error C2668: 'pow' : ambiguous call to overloaded function
1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(575): could be 'long double pow(long double,int)'
1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(527): or 'float pow(float,int)'
1> c:\program files\microsoft visual studio 9.0\vc\include\math.h(489): or 'double pow(double,int)'
1> while trying to match the argument list '(int, int)'
1>Build log was saved at "file://c:\Documents and Settings\Admin\My Documents\Visual Studio 2008\Projects\det\det\Debug\BuildLog.htm"
1>det - 1 error(s), 4 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
dino-4udo
-41 / 5 / 1
Регистрация: 16.12.2010
Сообщений: 68
29.11.2011, 12:11     Нужен пример нахождения определителя матрицы #6
оно не правильно считает!!!
sandye51
программист С++
682 / 584 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
29.11.2011, 13:45     Нужен пример нахождения определителя матрицы #7
Рекурсивно, раскладывая по первому столбцу
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
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <string>
#include <fstream>
#include <iterator>
#include <cmath>
#include <algorithm>
#include <conio.h>
#include <functional>
 
template <typename iteratorType, typename predType>
bool all_of (iteratorType iterBegin, iteratorType iterEnd, predType* pred)
{
        for ( ; iterBegin != iterEnd; ++iterBegin)
                if (!pred(*iterBegin))
                        return false;
        return true;
}
 
template <typename valueType>
class printing_matrix :
        public std::unary_function<std::vector<valueType>, void >
{
public:
        void operator() (const std::vector<valueType>& vec) const
        {
                std::copy(vec.begin(), vec.end(), std::ostream_iterator<valueType>(std::cout, " "));
                std::cout << std::endl;
        }
};
 
template <typename valueType>
void printMatrix(const std::vector<std::vector<valueType> >& matrix)
{
        std::for_each(matrix.begin(), matrix.end(), printing_matrix<valueType>());
}
 
template <typename valueType>
bool zero(const std::vector<valueType>& value)
{
        return !value.front();
}
 
template <typename valueType>
class comparer :
        public std::binary_function<std::vector<valueType>, std::vector<valueType>, bool>
{
        mutable int& compair;
public:
        comparer(int& value) :
          compair(value)
          {
          }
          bool operator() (const std::vector<valueType>& first, const std::vector<valueType>& second) const
          {
                  if (first.front() < second.front())
                          ++compair;
                  return first.front() > second.front();
          }
};
 
template <typename valueType>
class calc :
        public std::unary_function<std::vector<valueType>, void>
{
        mutable std::vector<std::vector<valueType> >& new_matrix;
        const std::vector<std::vector<valueType> > matrix;
 
        template <typename value_type>
        class privater :
                public std::unary_function<value_type, value_type>
        {
                mutable typename std::vector<value_type>::const_iterator first;
                const value_type k;
        public:
                privater(value_type k, const typename std::vector<value_type>::const_iterator& first) :
                  k(k), first(first)
                  {
                  }
                  value_type operator() (value_type value) const
                  {
                          return value -= k * (*first++);
                  }
        };
 
public:
        calc(std::vector<std::vector<valueType> >& new_matrix, const std::vector<std::vector<valueType> >& matrix) :
          new_matrix(new_matrix), matrix(matrix)
          {
          }
          void operator() (std::vector<valueType>& i) const
          {
                  std::transform(i.begin(), i.end(), i.begin(), privater<valueType>(i.front() / matrix.front().front(), matrix.begin()->begin()));
 
                  new_matrix.push_back(std::vector<double>(++i.begin(), i.end()));
          }
};
 
double determinant(std::vector<std::vector<double> > matrix)
{
        if (matrix.size() == 1)
                return matrix.front().front();
 
        if (all_of(matrix.begin(), matrix.end(), &zero<double>))
                return 0;
 
        int compair = 0;
        std::sort(matrix.begin(), matrix.end(), comparer<double>(compair));
 
        std::vector<std::vector<double> > new_matrix;
        std::for_each(++matrix.begin(), matrix.end(), calc<double>(new_matrix, matrix));
 
        return matrix.front().front() * determinant(new_matrix) * pow(-1.0, compair);
}
 
template <typename streamType>
class streamer :
        public std::unary_function<void, double>
{
        streamType& _file;
public:
        streamer(streamType& file) :
          _file(file)
          {
          }
 
          double operator() ()
          {
                  double tmp;
                  _file >> tmp;
                  return tmp;
          }
};
 
template <typename streamType, typename valueType>
class rander :
        public std::unary_function<std::vector<valueType>, void>
{
        mutable streamType& file;
        const unsigned int size;
public:
        rander(streamType& file, unsigned int size) :
          file(file), size(size)
          {
          }
          void operator() (std::vector<valueType>& vec) const
          {
                  std::generate_n(std::back_inserter(vec), size, streamer<streamType>(file));
          }
};
 
int main()
{
        srand(static_cast<unsigned int>(time(NULL)));
        setlocale(LC_ALL, "Russian");
 
        unsigned char key;
        do
        {
                std::cout << "Выберите тип формирования матрицы" << std::endl
                        << "\t1. Считать матрицы из файла" << std::endl
                        << "\t2. Ввод с клавиатуры" << std::endl
                        << "\t3. Выход из программы" << std::endl;
                key = _getch();
        } while (key < '1' || key > '3');
 
        std::vector<std::vector<double> > matrix;
 
        switch (key)
        {
        case '1':
                {
                        std::string fileName;
                        std::cout << "Введите имя файла" << std::endl;
                        std::cin >> fileName;
                        std::ifstream file(fileName.c_str());
 
                        std::vector<double>::size_type size;
                        file >> size;
                        matrix.resize(size);
                        std::for_each(matrix.begin(), matrix.end(), rander<std::ifstream, double>(file, size));
                }
                break;
        case '2':
                {
                        std::cout << "Введите размер матрицы" << std::endl;
                        std::vector<double>::size_type size;
                        std::cin >> size;
                        matrix.resize(size);
                        std::cout << "Введите матрицу" << std::endl;
                        std::for_each(matrix.begin(), matrix.end(), rander<std::istream, double>(std::cin, size));
                }
                break;
        case '3':
                return EXIT_SUCCESS;
        default:
                return EXIT_FAILURE;
        }
 
        std::cout << "Введенная матрица" << std::endl;
        printMatrix<double>(matrix);
 
        std::cout << "Определитель: \t" << determinant(matrix) << std::endl;
 
        _getch();
        return EXIT_SUCCESS;
}
dino-4udo
-41 / 5 / 1
Регистрация: 16.12.2010
Сообщений: 68
05.12.2011, 15:23     Нужен пример нахождения определителя матрицы #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот простенький код нахождения определителя.
Считает все правильно...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
double det (double xk[10][10], int razm)   //нахождение определителя
{
int l;
double d;
double sum11=1,sum12=0, sum21=1, sum22=0;
// находим детерминант
        for (int i=0;i<razm;i++)
        {
                sum11=1; l=2*razm-1-i;sum21=1;
        for (int j=0;j<razm;j++)
                {
            sum21*=xk[j][l%razm];
            l--;
            sum11*=xk[j][(j+i)%(razm)];
        }
        sum22+=sum21;
        sum12+=sum11;
    }
    d=sum12-sum22;
return d;
}
вызывать так:
C++
1
2
3
4
double dt;
double a[10][10];
int n;   //порядок матрицы
dt = det(a,n);
EvgeTrofi
Сообщений: n/a
20.03.2014, 06:55     Нужен пример нахождения определителя матрицы #9
Не пойму, каким образом у Вас всё работает? Переменная L становится отрицательной, а потом начинает использоваться в качестве индекса массива??? Это как?
Может быть Вы что-то скрыли от публики?
Вот мой вариант вычисления определителя на языке VB NET:
vb.net
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
    'Возвращает детерминант (определитель) матрицы
    Public Function det(ByVal M(,) As Double) As Double
        Dim a As Long = UBound(M, 1)
        Dim b As Long = UBound(M, 2)
        Dim multi As Double = 1
        If a <> b Then Return 0
        For i As Long = a + 1 To 3 Step -1 'Порядок матрицы
            Dim multiplier As Double
            EasyM(M, multiplier)
            multi *= multiplier
        Next
        det = multi * (M(0, 0) * M(1, 1) - M(0, 1) * M(1, 0))
    End Function
    'Процедура разложения определителя по элементам первой строки
    Private Sub EasyM(ByRef M(,) As Double, ByRef multiplier As Double)
        Dim a As Long = UBound(M, 1)
        Dim b As Long = UBound(M, 2)
        Dim i As Long = getNotNull(M)
        Do While i > -1 And i < b
            Dim j As Long = getNotNull(M, i + 1)
            If j < 0 Then Exit Do
            'Вычисляем множитель, на который нужно умножить j столбец, чтобы прибавить к i 
            'и при этом получить нулевой элемент в первой строке
            multiplier = -M(0, i) / M(0, j)
            For k As Long = 0 To a
                M(k, i) += multiplier * M(k, j)
            Next
            i = j
        Loop
        multiplier = Math.Pow(-1, 2 + i) * M(0, i)
        MinorMatrix(M, 0, i)
    End Sub
    'После выполнения процедуры в переменной M сформируется матрица с вычеркнутыми строкой row и столбцом col
    'Если найти определитель такой уменьшеной матрицы, то он будет называться минором
    Public Sub MinorMatrix(ByRef M(,) As Double, row As Long, col As Long)
        Dim a As Long = UBound(M, 1)
        Dim b As Long = UBound(M, 2)
        Dim EM(a - 1, b - 1) As Double
        Dim t As Long = -1
        For i As Long = 0 To a
            If i = row Then Continue For
            t += 1
            Dim p As Long = -1
            For j As Long = 0 To b
                If j = col Then Continue For
                p += 1
                EM(t, p) = M(i, j)
            Next
        Next
        M = EM
    End Sub
    'Возвращает индекс столбца в котором первая строка не нулевая
    'поиск начинается с позиции start включительно. Если не находит, то возвращает -1
    Private Function getNotNull(ByRef M(,) As Double, Optional start As Long = 0) As Long
        For i As Long = start To UBound(M, 2)
            If M(0, i) <> 0 Then Return i
        Next
        Return -1
    End Function
Тестировать так:
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    Public Sub testDET()
        'Dim M(,) As Double = {{4, 3, -4, 2, 0}, {2, -1, -3, -4, 2}, {3, 1, 1, 2, -1}, {1, 2, 3, 4, -1}, {-1, 1, -1, -2, 3}}
        Dim M(,) As Double = {{-3, 1, -2}, {1, -2, 1}, {2, 3, -1}}
        MsgBox(det(M))
    End Sub
 
    Private Sub printMatrix(M(,) As Double)
        Dim txt As String = ""
        For i As Long = 0 To UBound(M, 1)
            For j As Long = 0 To UBound(M, 2)
                txt &= " " & M(i, j)
            Next
            txt &= vbCrLf
        Next
        MsgBox(txt)
    End Sub
Sarad
0 / 0 / 0
Регистрация: 12.10.2015
Сообщений: 17
29.11.2016, 00:35     Нужен пример нахождения определителя матрицы #10
dino-4udo, господи, спасибо тебе добрый человек
zarko97
274 / 34 / 0
Регистрация: 11.10.2015
Сообщений: 308
15.01.2017, 20:47     Нужен пример нахождения определителя матрицы #11
dino-4udo, ваш алгоритм неверно работает, точнее вообще не работает
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.01.2017, 21:34     Нужен пример нахождения определителя матрицы
Еще ссылки по теме:
C++ Определитель матрицы - нужен полноценный пример
C++ Функция time для вычисления скорости нахождения Определителя.Dev-C++7.3.1.3
Вычисление определителя матрицы N*N C++
C++ Нахождение определителя матрицы
Нахождение детерминанта (определителя) матрицы C++

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

Или воспользуйтесь поиском по форуму:
marat_miaki
107 / 96 / 36
Регистрация: 08.04.2013
Сообщений: 345
15.01.2017, 21:34     Нужен пример нахождения определителя матрицы #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
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
157
// решение систем уравнении методом Крамера
#include <iostream>
#include <windows.h>
#include <cstdlib> 
#include <ctime>
#include <iomanip>
 
using namespace std;
 
    double findOpred (double **,int);                       //Функция для возврвтв определителя массива      
                                                            // поиск определителя
    bool getMatrixCoef(double **, int,double *,double **);  //заполнение
    void showMatrixCoef(double **, int ,double *);          // вывод на экран
    void MatrixCopy(double **a, int size, double **v);      //копирование массива v в а
    
int main(int argc, char* argv[])
 
{ setlocale(LC_ALL, "Rus");
 
//  int { 5, -1,  2},{  2, 3,-4},{ 1, 2,  3}    {-2, 19, 1};            //Массив для правой части
//  int { 3, -2, -4},{ -7, 4, 6},{ 2, 3, -1}    { 4,-34, 3};
  
 
    cout << "Введите колличество уровнений: ";
    int size;
    cin >> size;
    double **a = new double*[size];
    double **v = new double*[size];
    for (int i = 0; i < size; i++) {
        a[i] = new double[size + size] {};
        v[i] = new double[size + size] {};
    }
 
    double *b = new double[size] {};
    
    if (getMatrixCoef(a, size, b, v))
    {
    //  memcpy(v, a, sizeof(v)); 
        cout << endl << endl;
        showMatrixCoef(a, size, b);// Вывод массива после ввода
    }
   cout << endl;
//-------------------------------------------------------------------------------------//
    double temp, oprM; 
       
    oprM = findOpred(a, size);
    cout << "Vernul opr massiva  " << oprM << endl;
  
    if (oprM==0){
         cout << "Определитель массива равен 0. Уравнение имеет множество решении " << endl;
     }
    //Готовим массив для определителя х1..хn
    for (int j = 0; j < size; j++) {
         for (int i = 0; i < size; i++)     {  
            a[i][j]=b[i];
        }
     temp = findOpred(a,size);
     
    cout << "Vernul opr" << j <<"-  " << temp << endl;
    cout << "X" << j+1 << "- " << temp/oprM << endl;   
    // memcpy(a, v, sizeof(v));         //копирование массива v в а
    MatrixCopy(a, size ,v);         //копирование массива v в а 
    //  showMatrixCoef(a, size, b);
    }                                   // cout.setf(ios::scientific);
   
   for (int i = 0; i < size; i++) {
    delete [] a[i];
    delete [] v[i];
    }
    delete []a;
    delete []v;
    delete []b;
 
    system("PAUSE"); 
  return 0;
}
 
//-----------------------------------------------------------------------------------------------// 
 
double findOpred (double **arr, int rows)       //Функция для возврвтв определителя массива
{
    double opr1, sum;
    //-------------------------------------------------------------------------------------//
    //Приводим матрицу к правилу Саррюса 
 
    for (int i = 0; i < rows; i++){
        for (int j = 0; j < rows; j++) {
            arr[i][j+rows]=arr[i][j];
        }
    }
 //-----------------------------------------------------------------------------------------//   
 // находим определитель основной матрицы а+а+а-а-а-а  
    opr1=0;
    
    // метод крамера шаг 1 сумма диоганали для плюса надо повторить n раз от k=n
    for (int k = 0; k < rows; k++){
        sum=1;
        for (int i = 0; i < rows; i++){
            sum*=arr[i][i+k];
        }                       
    opr1+=sum;
    }
  // метод крамера шаг 2 сумма побочной диоганали для минуса повторить n-1 раз от k=n-1
    for (int k = 0; k < rows; k++){
        sum=1;    
        for (int i = 0; i < rows; i++){
        sum*=arr[i][rows-i-1+k];
        } 
    opr1-=sum;
    }
    
    return(opr1);
}
//----------------------------------------------------------------------------------------------
bool getMatrixCoef(double **a, int size, double *b,double **v)
{
    try
    {
        for (int i = 0; i < size; i++)
        {
            for (int j = 0; j < size; j++)
            {
                cout << "Введите " << j + 1 << " коиффициент " << i + 1 << " уравнения: ";
                cin >> a[i][j];
                v[i][j]=a[i][j];
            }
            cout << "Введите  свободный член " << i + 1 << " уравнения: ";
            cin >> b[i];
        }
    }
 
    catch (char *msg)
    {
        cout << "ВОЗНИКЛА ОШИБКА" << endl;
        cout << msg << endl;
        return false;
    }
    return true;
}
//-----------------------------------------------
void showMatrixCoef(double **a, int size ,double *b)
{
    cout << "Матрица коэффициентов СЛУ и соотв. свободные члены:" << endl;
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size ; j++)
            cout << setw(4) << a[i][j] ;
            cout << setw(4) << b[i] << endl;
    }
}
//-----------------------------------------------
void MatrixCopy(double **a, int size, double **v)
     {
        for (int i = 0; i < size; i++)
            for (int j = 0; j < size; j++)
                a[i][j] = v[i][j];
    }
Yandex
Объявления
15.01.2017, 21:34     Нужен пример нахождения определителя матрицы
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru