Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 02.08.2015
Сообщений: 124
1

Рассчитать определитель матрицы многопоточно

01.03.2016, 20:32. Показов 2808. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Требуется рассчитать определитель матрицы многопоточно, но что то считает не то.
Подскажите пожалуйста где ошибка?
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 <iostream>
#include <pthread.h>
using namespace std;
 int **mas;
 int m;
 int *det ; //скалярное произведение
struct bound //структура, определяющая границы вычислений потоков
{ int begin ; int end ; } ;
 
  bound b ; //границы вычислений для первого потока
  bound c ; //границы вычислений для второго потока
 
// Функция вывода матрицы
void PrintMatr (int **mas, int m) {
  int i,j;
  for(i=0;i<m;i++) {
    for(j=0;j<m;j++)
      cout << mas[i][j] << " ";
    cout << endl;
  }
}
// Получение матрицы без i-й строки и j-го столбца
void GetMatr(int **mas, int **p,int i,int j,int m) {
  int ki,kj,di,dj;
  di=0;
  for(ki=0;ki<m-1;ki++) { // проверка индекса строки
    if (ki==i)  di=1;
    dj=0;
    for(kj=0;kj<m-1;kj++) { // проверка индекса столбца
      if (kj==j)  dj=1;
      p[ki][kj]=mas[ki+di][kj+dj];
    }
  }
}
// Рекурсивное вычисление определителя
int Determinant(int **mas, int m, int start, int finish) {
 
  
   int i,j,d,k,n;
  int **p;
  p = new int* [m];
  for(i=0;i<m;i++)
    p[i] = new int[m];
  j=0; d=0;
  k=1; //(-1) в степени i
  n=m-1;
  if (m<1)  cout << "Определитель вычислить невозможно!" << endl;
  if (m==1) {
    d = mas[0][0];
    return(d);
  }
  if (m==2) {
    d=mas[0][0]*mas[1][1]-(mas[1][0]*mas[0][1]);
    return(d);
  }
  if (m>2){
 
    for (i = start; i < finish; i++) {
      GetMatr(mas,p,i,0,m);
      cout << mas[i][j] << endl;
      PrintMatr(p,n);
      d = d + k * mas[i][0] * Determinant(p,n,NULL,NULL);
      k=-k;
    }
  }
  return(d);
}
 
void *Det (void *param)
{
  
  det = new int ;
  bound *b = (bound *)param ; //преобразование из void* в bound*
 
  int start = b->begin;
  int finish = b->end;
  *det=Determinant(mas, m, start, finish);
  return (void *)det ;
}
 
// Основная функция
int main() {
  int i, j, d;
  
 
  system("chcp 1251");
  system("cls");
  cout << "Введите размерность квадратной матрицы: ";
  cin >> m;
  mas = new int* [m];
  for(i=0;i<m;i++) {
    mas[i] = new int[m];
    for(j=0;j<m;j++) {
      cout << "mas[" << i << "][" << j << "]= ";
      cin >> mas[i][j];
    }
  }
 
    pthread_t thread1, thread2;//идентификаторы для созданных потоков
    b.begin = 0; //Диапазоны вычислений для thread1 потока
    b.end   = m/2;
    pthread_create(&thread1,NULL,Det,(void *) &b);//создание первого потока, производящего вычисления от 0 до str.size()/2
    c.begin =m/2+1; //Диапазоны вычислений для thread2 потока
    c.end   = m;
    pthread_create(&thread2,NULL,Det,(void *) &c); //создание второго потока, производящего вычисления от str.size()/2+1 до str.size()
 
    pthread_join(thread1, NULL); //ожидание завершения первого потока, в retu1 записывается адрес просто числа 10;
    pthread_join(thread2, NULL);
 
  PrintMatr(mas, m);
   d = *det;
  cout << "Определитель матрицы равен " << d;
  cin.get(); cin.get();
  return 0;
}
Добавлено через 1 час 5 минут
Один поток работает отрабатывает нормально если задать диапазон от 0 до m. А как если разделить на два потока?

Добавлено через 12 минут
Где задавать диапазон здесь
C++
1
2
3
4
5
6
7
8
9
10
if (m>2){
 
    for (i = start; i < finish; i++) {
      GetMatr(mas,p,i,0,m);
      cout << mas[i][j] << endl;
      PrintMatr(p,n);
      d = d + k * mas[i][0] * Determinant(p,n,NULL,NULL);
      k=-k;
    }
  }
или в другом месте. Диапазон определяется start и finish.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.03.2016, 20:32
Ответы с готовыми решениями:

Рассчитать определитель матрицы
в файле test.in создать 2 матрицы , рассчитать их определитель и их результат записать в test.out

Определитель матрицы, ранг матрицы, обратная матрица
Вы можете помочь, сделать определитель матрицы, или у кого есть коде: ранг матрицы, обратная...

Определитель матрицы
Не могу написать код реккурсивной ф-ии на С для подсчёта опредилителя матрцы nxn, помогите кто чем...

Определитель матрицы
Добрый день.Проблема в том,что при n&gt;= 4 программа падает с крахом,а в чем проблема понять не могу...

4
515 / 407 / 188
Регистрация: 08.04.2013
Сообщений: 1,739
01.03.2016, 20:46 2
функция
C++
1
59 GetMatr(mas,p,i,0,m);
если задаешь диапазон for (i = start; i < finish; i++) отличный от 0,m что даст? или что ожидаешь от этой функции?
0
0 / 0 / 0
Регистрация: 02.08.2015
Сообщений: 124
01.03.2016, 21:38  [ТС] 3
я рассчитываю что 2 потока будут рассчитывать определитель матрицы по первому столбцу, от 0 до m/2 (целочисленное деление) первый поток и от m/2+1 до m элементов первого столбца второй поток. Два потока должны отработать и получить общую d (определитель матрицы)
C++
1
GetMatr(mas,p,i,0,m)
- каждый раз с каждым циклом делает матрицу без i-й строки и j-го столбца т.е как бы вычеркивает (для нахождение определителя матрицы).
0
515 / 407 / 188
Регистрация: 08.04.2013
Сообщений: 1,739
02.03.2016, 07:15 4
Наверное стоит сначала сделать рабочую программу под определители для матрицы 3*3 и довести до ума функцию под неё, а потом уже допиливать под N*N а не все сразу
последнюю строку или столбец m отметаешь сразу, почем? ( m-1) для 3*3 нужны вся начальная матрица
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// Получение матрицы без i-й строки и j-го столбца
void GetMatr(int **mas, int **p,int i,int j,int m) {
  int ki,kj,di,dj;
  di=0;
  for(ki=0;ki<m-1;ki++) { // проверка индекса строки
    if (ki==i)  di=1;
    dj=0;
    for(kj=0;kj<m-1;kj++) { // проверка индекса столбца
      if (kj==j)  dj=1;
      p[ki][kj]=mas[ki+di][kj+dj];
    }
  }
}
0
0 / 0 / 0
Регистрация: 02.08.2015
Сообщений: 124
03.03.2016, 18:44  [ТС] 5
если сделать так
C++
1
2
3
4
5
6
7
8
9
10
pthread_t thread1, thread2;//идентификаторы для созданных потоков
    b.begin = 0; //Диапазоны вычислений для thread1 потока
    b.end   = m // b.end   = m/2;
    pthread_create(&thread1,NULL,Det,(void *) &b);//создание первого потока, производящего вычисления от 0 до str.size()/2
   // c.begin =m/2+1; //Диапазоны вычислений для thread2 потока
   // c.end   = m;
  //  pthread_create(&thread2,NULL,Det,(void *) &c); //создание второго потока, производящего вычисления от //str.size()/2+1 до str.size()
 
    pthread_join(thread1, NULL); //ожидание завершения первого потока, в retu1 записывается адрес просто числа 10;
   // pthread_join(thread2, NULL);
вроде правильно работает с одним потоком, а как с двумя потоками сделать?
А m-1 в функции GetMatr потому что мы с помощью ее получаем без без i-й строки и j-го столбца

Добавлено через 6 часов 32 минуты
У меня возникла идея, а если вернуть значения
C++
1
2
3
4
int *sum1;
int *sum2;
pthread_join(thread1, (void **)&sum1); 
pthread_join(thread2, (void **)&sum2);
а потом вычислить определитель
d=*sum1+*sum2;

только как сделать чтоб потоки отработали параллельно?

Добавлено через 19 часов 41 минуту
Дорогие программисты кто понимает в параллельном программировании наведите меня пожалуйста на правильную мысль?
0
03.03.2016, 18:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.03.2016, 18:44
Помогаю со студенческими работами здесь

Определитель матрицы
Всем добрый вечер=) Написал программу для вычисления определителя матрицы. Она запускается но...

Определитель Матрицы
доброе время суток Напишите у кого есть код нахождения определителя матрицы мне надо 4х4 ну а...

Найти определитель матрицы
Для матрицы NxN определитель задаётся рекурсивно: кто нить может пояснить как записать проше на...

Вычислить определитель матрицы
int main () { int a1; int a2; int a3; cout&lt;&lt;&quot;Vvedite elementi pervoy stroki\n&quot;; for...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru