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

С++, определитель матрицы, вычеркивание элемента - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.83
OffyGhost
 Аватар для OffyGhost
7 / 7 / 1
Регистрация: 04.03.2010
Сообщений: 107
23.02.2011, 06:16     С++, определитель матрицы, вычеркивание элемента #1
Сколько не искал по форуму, не нашел работающей проги на определитель.

Суть такова, пользователь вводит N (размерность матрицы N*N), потом вводит элементы, и потом пишет элемент (строка I, столб J) - что приводит к удалению из матрицы всех I, J. (матрица уменьшается на один размер) и потом находится уже получившаяся матрица

Помогите найти, написать
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2011, 06:16     С++, определитель матрицы, вычеркивание элемента
Посмотрите здесь:

«Вычеркивание» строки и столбца из матрицы оформить как функцию потока C++
Определитель матрицы C++
C++ определитель матрицы
C++ Определитель матрицы
определитель матрицы 5*5 C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ping_rulezzz
26 / 26 / 4
Регистрация: 18.02.2011
Сообщений: 51
23.02.2011, 12:24     С++, определитель матрицы, вычеркивание элемента #2
находится
высчитывается детерминант или просто выводится на экран новая матрица?

Добавлено через 1 час 3 минуты
просто выводит на экран новую матрицу
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
#include "stdafx.h"
#include "iostream"
#include "vector"
using namespace std;
 
void main()
{
    unsigned int N = 0;
    unsigned int I = 0;
    unsigned int J = 0;
 
    cout << "Enter size of matrix. N = ";
    cin >> N;
 
    int **matrix = new int*[N];
    for (size_t i = 0; i < N; ++i) {
        matrix[i] = new int[N];
    }
 
    int **matrix2 = new int*[N - 1];
    for (size_t i = 0; i < N - 1; ++i) {
        matrix2[i] = new int[N - 1];
    }
 
 
    cout << "Fill the matrix:\n";
    for (size_t i = 0; i < N; ++i) {
        for (size_t j = 0; j < N; ++j) {
            cin >>  matrix[i][j];
        }
    }
    cout << "Enter number of line. I = ";
    cin >> I;
    cout << "Enter number of column. J = ";
    cin >> J;
 
    if (I > N || J > N) {
        cout << "Uncorrect input";
    } else {
        for (size_t i = 0, i2 = 0; i < N; ++i) {
            for(size_t j = 0, j2 = 0; j < N; ++j) {
                if (i != (I - 1) && j != (J - 1)) {
                    matrix2[i2][j2++] = matrix[i][j];
                }
            }
            if (i != (I - 1)) ++i2;
        }
 
        for (size_t i = 0; i < N - 1; ++i) {
            for (size_t j = 0; j < N - 1; ++j) {
            cout << matrix2[i][j];
            }
            cout << endl;
        }
    }
 
    for(size_t i = 0; i < N; i++)
        delete []matrix[i];
    delete []matrix;
 
    for(size_t i = 0; i < N - 1; i++)
        delete []matrix2[i];
    delete []matrix2;
}
OffyGhost
 Аватар для OffyGhost
7 / 7 / 1
Регистрация: 04.03.2010
Сообщений: 107
23.02.2011, 13:05  [ТС]     С++, определитель матрицы, вычеркивание элемента #3
\\высчитывается детерминант или просто выводится на экран новая матрица?
блин забыл подписать, что выводится на экран матрциа без I, J и потом находится ее определитеть %)
спасибо за прогу, это половинка ее )
ping_rulezzz
26 / 26 / 4
Регистрация: 18.02.2011
Сообщений: 51
23.02.2011, 13:50     С++, определитель матрицы, вычеркивание элемента #4
Реализация вычисление определителя методом Гаусса

Нужен пример нахождения определителя матрицы
http://www.e-maxx.ru/algo/determinant_gauss
OffyGhost
 Аватар для OffyGhost
7 / 7 / 1
Регистрация: 04.03.2010
Сообщений: 107
25.02.2011, 08:19  [ТС]     С++, определитель матрицы, вычеркивание элемента #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 ==========
ping_rulezzz
26 / 26 / 4
Регистрация: 18.02.2011
Сообщений: 51
25.02.2011, 19:00     С++, определитель матрицы, вычеркивание элемента #6
говорит, что нет такой перегрузки для функции pow. в данном случае на нужна функция такого вида: float pow(float,int), т.е.
C++
1
kst=pow(-1.,p);
OffyGhost
 Аватар для OffyGhost
7 / 7 / 1
Регистрация: 04.03.2010
Сообщений: 107
26.02.2011, 18:09  [ТС]     С++, определитель матрицы, вычеркивание элемента #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
#include<stdio.h>
#include<math.h>
#include<conio.h>
#include<stdlib.h>
#include "iostream"
#define NN 6
using namespace std; 
 
void main()
{
 setlocale(LC_ALL,"Russian");
float a[NN][NN],kst;
float matrix2[NN][NN]
int i,j,n,p,k,t;
char yn;
int J,I, i2,j2;
 k=0;
// <----Ввод размера квадратной матрицы---->
 
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");
}
        cout << "Enter number of line. I = ";
        cin >> I;
        cout << "Enter number of column. J = ";
        cin >> J;
        if (I > NN || J > NN) 
        {
                cout << "Uncorrect input"; 
        } else {
                for (i = 0, i2 = 0; i < NN; ++i) {
                        for(j = 0, j2 = 0; j < NN; ++j) {
                                if (i != (I - 1) && j != (J - 1)) {
                                        matrix2[i2][j2++] = a[i][j];
                                }
                        }
                        if (i != (I - 1)) ++i2;
                }
 
                for (i = 0; i < NN - 1; ++i) {
                        for (j = 0; j < NN - 1; ++j) {
                        cout << matrix2[i][j];
                        }
                }
        }
 
// <----Считаем определитель---->
 
p=0;
for (i=0; i<n-1; i++)
{
t=1;
while(matrix2[i][i]==0)
{
for(j=0; j<n; j++)
{
matrix2[i][j]=kst;
matrix2[i][j]=matrix2[i+t][j];
matrix2[i+t][j]=kst;
}
p++;
t++;
}
 
for (k=i+1; k<n; k++)
{
kst=matrix2[k][i]/matrix2[i][i];
for(j=0; j<n; j++)
matrix2[k][j]-=matrix2[i][j]*kst;
}
}
 
kst=pow(-1.,p);
for(i=0; i<n; i++)
kst*=matrix2[i][i];
 
printf("Определитель равен: %14.3f",kst);
getch();
}
Объединил обе проги
но
опять непонятные ошибки цепепе
Введите размер матрицы (от 2 до 6): N=4

Задать матрицу случайно? y/n: n
Введите матрицу 4x4
1 2 3 5 6 7 8 6 4 2 2
1 2 3
4
5

1,00 2,00 3,00 5,00

6,00 7,00 8,00 6,00

4,00 2,00 2,00 1,00

2,00 3,00 4,00 5,00

Enter number of line. I = 2
Enter number of column. J = 2
135-1.07374e+008-1.07374e+008421-1.07374e+008-1.07374e+008245-1.07374e+008-1.073
74e+008-1.07374e+008-1.07374e+008-1.07374e+008-1.07374e+008-1.07374e+008-1.07374
e+008-1.07374e+008-1.07374e+008-1.07374e+008-1.07374e+008Определитель равен: -46
116854858514432,000
ping_rulezzz
26 / 26 / 4
Регистрация: 18.02.2011
Сообщений: 51
26.02.2011, 19:49     С++, определитель матрицы, вычеркивание элемента #8
держите, вроде всё работает

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
#include "stdafx.h"
#include "iostream"
#include "math.h"
 
using namespace std;
void foo(float **matrix, int n);
void main()
{
    unsigned int N = 0;
    unsigned int I = 0;
    unsigned int J = 0;
 
    cout << "Enter size of matrix. N = ";
    cin >> N;
 
    int **matrix = new int*[N];
    for (size_t i = 0; i < N; ++i) {
        matrix[i] = new int[N];
    }
 
    float **matrix2 = new float*[N - 1];
    for (size_t i = 0; i < N - 1; ++i) {
        matrix2[i] = new float[N - 1];
    }
 
 
    cout << "Fill the matrix:\n";
    for (size_t i = 0; i < N; ++i) {
        for (size_t j = 0; j < N; ++j) {
            cin >>  matrix[i][j];
        }
    }
    cout << "Enter number of line. I = ";
    cin >> I;
    cout << "Enter number of column. J = ";
    cin >> J;
 
    if (I > N || J > N) {
        cout << "Uncorrect input";
    } else {
        for (size_t i = 0, i2 = 0; i < N; ++i) {
            for(size_t j = 0, j2 = 0; j < N; ++j) {
                if (i != (I - 1) && j != (J - 1)) {
                    matrix2[i2][j2++] = matrix[i][j];
                }
            }
            if (i != (I - 1)) ++i2;
        }
 
        for (size_t i = 0; i < N - 1; ++i) {
            for (size_t j = 0; j < N - 1; ++j) {
            cout << matrix2[i][j] << "  ";
            }
            cout << endl << endl;
        }
        foo(matrix2, N-1);
    }
 
    for(size_t i = 0; i < N; i++)
        delete []matrix[i];
    delete []matrix;
 
    for(size_t i = 0; i < N - 1; i++)
        delete []matrix2[i];
    delete []matrix2;
}
 
void foo(float **matrix, int n) {
 
    float **a = new float*[n + 1];
    for (size_t i = 0; i < n + 1; ++i) {
        a[i] = new float[n + 1];
    }
 
    for (size_t i = 0; i < n; ++i) {
        for (size_t j = 0; j < n; ++j)
            a[i][j] = matrix[i][j];
    }
 
 
    int p = 0;
    int t,i,j,k = 0;
    float kst = 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]/(float)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];
 
    cout << "det = " << kst << endl;
 
    for(size_t i = 0; i < n + 1; i++)
        delete []a[i];
    delete []a;
}
OffyGhost
 Аватар для OffyGhost
7 / 7 / 1
Регистрация: 04.03.2010
Сообщений: 107
27.02.2011, 06:02  [ТС]     С++, определитель матрицы, вычеркивание элемента #9
Огромное спасибо! решает обычным методом 2х2, 3х3 так и прогонкой гаусса 4х4.. ))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2015, 22:14     С++, определитель матрицы, вычеркивание элемента
Еще ссылки по теме:

C++ Матрицы: найти определитель заданной матрицы n-го порядка методом Гаусса (и ещё 6 задач)
C++ Определитель матрицы
C++ Определитель матрицы, ранг матрицы, обратная матрица

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

Или воспользуйтесь поиском по форуму:
sot147
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 27
02.12.2015, 22:14     С++, определитель матрицы, вычеркивание элемента #10
помогите, не читает эти строки -
Код
#include "stdafx.h"
#include "math.h"
Yandex
Объявления
02.12.2015, 22:14     С++, определитель матрицы, вычеркивание элемента
Ответ Создать тему
Опции темы

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