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

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

Восстановить пароль Регистрация
 
DexMipt
13 / 13 / 1
Регистрация: 13.03.2011
Сообщений: 98
10.04.2012, 23:37     паралелльное определение детерминанта #1
Вроде как полно в интернете как найти определитель, но не как пойму как же все это реализовать. Буду очень рад за готовый код ))
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2012, 23:37     паралелльное определение детерминанта
Посмотрите здесь:

Определение типа! C++
Нахождение детерминанта (определителя) матрицы C++
C++ определение разрядности
C++ Определение константы
C++ Нахождение детерминанта матрицы. Матрица читается из файла.
C++ Есть ли нерекурсивный алгоритм вычисления детерминанта квадратной матрицы nxn?
Нахождения детерминанта C++
C++ Определение цифры
Определение функции C++
Нахождения детерминанта C++
Не работает вычисление детерминанта матрицы C++
C++ Нахождение детерминанта матрицы и её ручной ввод

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
11.04.2012, 00:33     паралелльное определение детерминанта #2
Ну, смотри. Есть 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);
}
}
DexMipt
13 / 13 / 1
Регистрация: 13.03.2011
Сообщений: 98
11.04.2012, 23:33  [ТС]     паралелльное определение детерминанта #3
Спасибо, но все таки есть у кого нить идеи как же все это распараллелить ?
Yandex
Объявления
11.04.2012, 23:33     паралелльное определение детерминанта
Ответ Создать тему
Опции темы

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