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

паралелльное определение детерминанта - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Игра на C++ http://www.cyberforum.ru/cpp-beginners/thread544812.html
Господа эксперты, допустим что у меня в графическом режиме есть некий статический обьект. Как мне им управлять с клавиатуры? (Up,Down,Left,Right) int driver = DETECT, mode = 0; int hx,hy; initgraph( &driver, &mode, "" ); for(hx=200,hy=200;hx<500;hx+=10)
C++ Использование std::system() компилирую в студии 2010. система win7. #include <Windows.h> int main() { int i=0; while(i<1) { system("cls"); http://www.cyberforum.ru/cpp-beginners/thread544804.html
C++ Массив через цикл
Здравствуйте, на практике дали задание, в принципе я знаю как его сделать только через массив, а вот только нужно обязательно с помощью циклов, может кто поможет, у меня не получилось решить. Мы имеем: х1=y2=1 x=0.3*x y=x+y n - натуральное число i=2,3... Найти: Ʃx/(1+|y|)
C++ получение двух результатов из функции
нужно сделать ф-цию, которая будет возвращать периметр и площадь прямоугольника процедура на паскале выглядит так: Procedure RectPS(x1, y1, x2, y2:real; var P, S:real); begin P:=(abs(x1-x2)+abs(y1-y2))*2; S:=abs(x1-x2)*abs(y1-y2); end; пытался сделать, не работает( #include <iostream.h> #include <conio.h>
C++ Работа с функциями http://www.cyberforum.ru/cpp-beginners/thread544778.html
Помогите кто может с программой! Очень нужно, для будущего авиации))) Вычислить сумму значений функций Z=f(u,t) Z=f(sinX+cosY, X+Y) + f(sinX, cosY)+f(sin^2 X-2, a+b^2) Где: f(u,t) = u+t if u>1 u-t if 0<=u<=1 t-u if 0<u
C++ Помогите перегрузить операцию присваивания Здравствуйте, есть программа: #include<iostream> using namespace std; struct Element { char data; //Aaiiua Element *Next; //Aa?an ne yeaiaioa }; class List { подробнее

Показать сообщение отдельно
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
11.04.2012, 00:33     паралелльное определение детерминанта
Ну, смотри. Есть 3 варианта:
1) В лоб. Рекурсия. Некошерно. (Пишу сразу функцию, ей передашь матрицу float* *m и ее размер n). В моей номерации элемент матрицы задается как элемент[строка][столбец]
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
float det(float* *m,int n)
{
if(n==1)
return m[0][0];
float s=0;
for(int i=0; i<n; i++)
{
float k=m[0][i]*det(minor(i),n-1);
if(i%2==0)
s+=k;
else s-=k;
}
return s;
}
 
float* *minor(float* *m,int n, int i)//Возвращает матрицу-минор к элементу (0,i)
{
float* *min=new float*[n-1];
for(int j=0; j<n-1; j++)
{
min[j]=new float[n-1];
for(int k=0; k<n-1; k++)
{
if(k<i)
min[j][k]=m[j+1][k];
else if(k>i)
min[j][k]=m[j+1][k+1];
}
}
return min;
}
2) Сначала упростить задачу своим моском. Любая невырожденая матрица раскладывается на произведение нижней треугольной (L) и верхней треугольной с единицами на главной диагонали (U).
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
float* *l=new float*[n];
float* *u=new float*[n];
for(int i=0; i<n; i++)
{
    u[i]=new float[n];
    l[i]=new float[n];
    for(int j=0; j<n; j++)
    {
        u[i][j]=0;
        l[i][j]=0;
    }
}
for(int i=0; i<n; i++)
{
    u[i][i]=1;
    for(int j=i; j<n; j++)
    {
        l[j][i]=a[j][i];
        for(int k=0; k<i; k++)
            l[j][i]=l[j][i]-l[j][k]*u[k][i];
    }
    for(int j=i+1; j<n; j++)
    {
        u[i][j]=a[i][j];
        for(int k=0; k<i; k++)
            u[i][j]=u[i][j]-l[i][k]*u[k][j];
        u[i][j]=u[i][j]/l[i][i];
    }
Вот этот код делает разложение матрицы a [n на n] на L и U
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
float det(float* *m1, int n, float tolerance)//tolerance -- точность
{
if(n==1)
return m1[0][0];
float* *m=new float*[n];
for(int i=0; i<n; i++)
{
m[i]=new float[n];
for(int j=0; j<n; j++)
m[i][j]=m1[i][j];
}//Копируем матрицу, чтобы не изменять то, что мы передавали функцию
if(abs(m[0][0])>tolerance)//Не 0 на главной диаг.
{
for(int i=1; i<n; i++)
{
float k=m[i][0]/m[0][0];
for(int j=0; j<n; j++)
m[i][j]-=k*m[0][j];
}
float* *m2=new float*[n-1];
for(int i=0; i<n-1; i++)
{
m2[i]=new float[n-1];
for(int j=0; j<n-1; j++)
m2[i][j]=m[i+1][j+1];
}
float s=m[0][0]*det(m2,n-1,tolerance);
delete m;
delete m2;
return s;
}
else//0 на главной
{
int flag=false;//Есть ли не 0 в первом столбце
for(int i=1; i<n; i++)
if(abs(m[i][0])>tolerance)//Нашли такую строку
{
if(i%2==0)
flag=-1;//Она четная
else
flag=1;
float tmp;//буффер
for(int j=0; j<n; j++)
{
tmp=m[0][j];
m[0][j]=m[i][j];
m[i][j]=tmp;
}//Поставили ее наверх -- теперь m[0][0]!=0
break;
}
if(flag==0)
return 0;
return flag*det(m,n,tolerance);
}
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru