Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
DexMipt
13 / 13 / 1
Регистрация: 13.03.2011
Сообщений: 98
#1

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

10.04.2012, 23:37. Просмотров 307. Ответов 2
Метки нет (Все метки)

Вроде как полно в интернете как найти определитель, но не как пойму как же все это реализовать. Буду очень рад за готовый код ))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.04.2012, 23:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос паралелльное определение детерминанта (C++):

Нахождения детерминанта - C++
Это функция для нахождения детерминанта 3 степени - double thre(double a,double x,double c,double a1,double x1,double c1,double...

Нахождения детерминанта - C++
Всю голову уже сломал и не могу понять в чем дело. Вот начало кода функции вычисляющей определитель матрицы методом Гаусса: int...

Нахождение детерминанта (определителя) матрицы - C++
У меня вот код есть для нахождения детерминанта (определителя) матрицы 5х5 :) а как сделать, чтобы я мог сам ввести данные матрицы? ...

Не работает вычисление детерминанта матрицы - C++
Всем привет! Есть класс матрица. Один из его методов - вычисление определителя. На нем валится программа. Не могу понять, почему(...

Нахождение детерминанта матрицы и её ручной ввод - C++
Здравствуйте! Который вот уже день бьюсь! Не могу найти ошибку! Нужно поставить ручной ввод и найти детерминант. Матрица сначала...

Нахождение детерминанта матрицы. Матрица читается из файла. - C++
#include <stdlib.h> #include <stdio.h> #include <sys/file.h> #include <conio.h> #include <iostream> #include <math.h> using...

2
UFO94
264 / 253 / 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);
}
}
0
DexMipt
13 / 13 / 1
Регистрация: 13.03.2011
Сообщений: 98
11.04.2012, 23:33  [ТС] #3
Спасибо, но все таки есть у кого нить идеи как же все это распараллелить ?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2012, 23:33
Привет! Вот еще темы с ответами:

Есть ли нерекурсивный алгоритм вычисления детерминанта квадратной матрицы nxn? - C++
Я в алгебре очень слаб. В голове есть идея вычислить детерминант по перестановкам, но в голову не приходит алгоритм перебора всех...

Вычисление детерминанта - Delphi
Вычислить определитель матрицы, пользуясь формулой разложения по первой строке, где матрица Bk получается из A вычеркиванием первой строки...

Вычисление детерминанта матрицы - C#
Нужно написать вычисление детерминанта матрицы. Неправильно считает матрицы, размерность которых &gt;3. Заранее благодарен за помощь! Вот...

Физический смысл детерминанта матрицы - Алгебра
Добрый вечер! Подскажите пожалуйста в чем физический смысл детерминанта матрицы? Как его найти и закономерности работы мы знаем. То...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

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