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

Найти произведение минимальных элементов каждой строки матрицы - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.94
z0rde
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 12
27.05.2012, 17:53     Найти произведение минимальных элементов каждой строки матрицы #1
Уважаемые форумчане ! Пожалуйста помогите решить простенькую задачку ! А именно :
Найти произведение минимальных элементов каждой строки матрицы (m x n). Спасибо !

Добавлено через 2 часа 19 минут
Поправка нужна программа с использованием библиотеки MPI
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.05.2012, 17:53     Найти произведение минимальных элементов каждой строки матрицы
Посмотрите здесь:

C++ Найти произведение положительных элементов каждой строки матрицы
C++ Найти произведение наименьших элементов каждой строки матрицы и их координаты
C++ Найти произведение наибольших элементов каждой строки матрицы
C++ Дана Матрица А(5.4) 1)Найти одномерный массив В из сумм элементов каждой строки матрицы 2)найти максимальный элемент матрицы А в 5-ой строке 3)Заме
Определить минимальный элемент каждой строки матрицы и найти произведение положительных элементов, расположенных на ее главной диагонали. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Петррр
 Аватар для Петррр
5915 / 3352 / 333
Регистрация: 28.10.2010
Сообщений: 5,926
19.06.2012, 16:27     Найти произведение минимальных элементов каждой строки матрицы #2
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
#include <iostream>
#include <iomanip>
#include <ctime>
 
#define n 5
#define m 6
 
int main()
{
    int matrix[n][m];
    std::srand(std::time(NULL));
    int prod = 1;
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < m; j++)
            std::cout << std::setw(4) << (matrix[i][j] = rand() % 20 + 1);
        std::cout << std::endl;
        int min = matrix[i][0];
        for(int j = 0; j < m; j++)
            if (matrix[i][j] < min)
                min = matrix[i][j];
        prod *= min;
    }
    std::cout << "Prod: " << prod << std::endl;
    system("pause");
    return 0;
}
-=ЮрА=-
Заблокирован
Автор FAQ
20.06.2012, 14:19     Найти произведение минимальных элементов каждой строки матрицы #3
z0rde, c MPI я не работал а вот распараллелить вычисления могу, например через Критическую секцию
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
#include <windows.h>
#include <process.h>
#include <iostream>
#include <iomanip>
#include <ctime>
using namespace std;
 
CRITICAL_SECTION cs;//Объявляем критическую секцию
//распараллеливать работу будет через неё
 
//структура для передачи параметров в thread-нить
struct RowThreadData
{
    int n;
    double * pRow;
    double minElem;
    bool bFinish;
};
 
//Сама thread-нить организующая вычисление мин элемента в строке
void getMinElem(void * lpParam);
 
int main()
{
    int i,j;//Счётчики
    int m;//будет содержать число строк матрицы
    int n;//будет содержать число стобцов матрицы
    double ** arr;//указатель на саму матрицу
    RowThreadData * pData;//Указатель на массив структур thread-нитей
    InitializeCriticalSection(&cs);//Организуем критическую секцию
    cout<<"m = ";cin>>m;
    cout<<"n = ";cin>>n;
    //выделяем память 
    arr   = new double*[m];//под указатели на строки матрицы
    pData = new RowThreadData[m];//Под вектор структур для thread-нитей
    //Рандомно гененрируем, печатаем элементы матрицы
    srand(time(0));//устанавливаем нач значение генератора случ чисел
    for(i = 0; i < m; i++)
    {
        arr[i] = new double[n];//Выделяем память под элементы i-й строки
        for(j = 0; j < n; j++)
            //генерирем числа от 0.1 до 10.0
            cout<<setw(4)<<(arr[i][j] = 0.1*(rand()%99) + 0.1)<<" ";
        cout<<endl;
        //Организуем thread-нить
        pData[i].n       = n;
        pData[i].pRow    = arr[i];
        pData[i].minElem = arr[i][0];
        pData[i].bFinish = false;
        _beginthread(getMinElem,0,&pData[i]);//Делаем дочерний поток
    }
    bool bFinish = false;
    //рослушиваем все потоки на завершение их работы
    while(!bFinish)
    {
        for(i = 0; i < m; i++)
        {
            EnterCriticalSection(&cs);
            if(pData[i].bFinish)
                bFinish = true;
            LeaveCriticalSection(&cs);
        }
    }
    double minMult = 1;//Будет содержать произведение мин элементов
    //Считываем результаты расчётов потоков 
    //+ чистим память под arr
    for(i = 0; i < m; i++)
    {
        minMult *= pData[i].minElem;
        delete [] arr[i];
    }
    //Дочищаем память
    delete [] arr;
    delete [] pData;
    cout<<"Calculations stoped answer is : "<<minMult<<endl;
    DeleteCriticalSection(&cs);//Удаляем критическую секцию
    system("pause");
    return 0;
}
    
void getMinElem(void * lpParam)
{   
    RowThreadData *pData = (RowThreadData *)lpParam;
    while(!pData->bFinish && pData->n)
    {
        if(pData->minElem < pData->pRow[pData->n - 1])
            pData->minElem = pData->pRow[pData->n - 1];
        if(!(pData->n = pData->n - 1))
            pData->bFinish = true;
    }
    _endthread();
}
Миниатюры
Найти произведение минимальных элементов каждой строки матрицы  
Вложения
Тип файла: rar ParallelCalcMult.exe.rar (49.4 Кб, 12 просмотров)
Тип файла: rar ParallelCalcMult_poject.rar (7.5 Кб, 12 просмотров)
-=ЮрА=-
Заблокирован
Автор FAQ
20.06.2012, 14:26     Найти произведение минимальных элементов каждой строки матрицы #4
90% уверен что весь код ниже вызовет сплошной вопрос
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
void getMinElem(void * lpParam)
{ *
* * RowThreadData *pData = (RowThreadData *)lpParam;
* * while(!pData->bFinish && pData->n)
* * {
* * * * if(pData->minElem < pData->pRow[pData->n - 1])
* * * * * * pData->minElem = pData->pRow[pData->n - 1];
* * * * if(!(pData->n = pData->n - 1))
* * * * * * pData->bFinish = true;
* * }
* * _endthread();
}
Поясню
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
RowThreadData *pData = (RowThreadData *)lpParam;
- получили из переданных параметров lpParam поля структуры RowThreadData

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
while(!pData->bFinish && pData->n)
- цикл пока флаг pData->bFinish не будет иметь значение ИСТИНА, либо пока pData->n(он у меня совмещён со счётчиком) больше нуля

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(pData->minElem < pData->pRow[pData->n - 1])
* * * * * * pData->minElem = pData->pRow[pData->n - 1];
- простой поиск мин элемента
массив pData->pRow, индекс pData->n - 1

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
if(!(pData->n = pData->n - 1))
* * * * * * pData->bFinish = true;
- совмещённое условие с декриментом счётчика, как только досттигли нуля (т.е. пробрали сзади все элементы строки) ставим флаг pData->bFinish в положение ИСТИНА и тем самым выходим из данного цикла

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
while(!pData->bFinish && pData->n)
, а значит и завершаем поток. Ну а тут просматриваем состояние всех потоков

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
EnterCriticalSection(&cs);
* * * * * * if(pData[i].bFinish)
* * * * * * * * bFinish = true;
* * * * * * LeaveCriticalSection(&cs);
Матрица то может быть в сотню тысяч элементов, тогда потоки нитей будут рабоать ощутимое для пользователя время, а так я уверен для матриц с числоммэлементов менее 100 можно было бы даже исключить эту часть алгоритма

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
while(!bFinish)
* * {
* * * * for(i = 0; i < m; i++)
* * * * {
* * * * * * EnterCriticalSection(&cs);
* * * * * * if(pData[i].bFinish)
* * * * * * * * bFinish = true;
* * * * * * LeaveCriticalSection(&cs);
* * * * }
* * }
всё равно потоки запущенные здесь

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
_beginthread(getMinElem,0,&pData[i]);
успевали бы осуществить расчёт ещё до того как закончили бы этот цикл с параметром
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
for(i = 0; i < m; i++)
z0rde
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 12
20.06.2012, 21:09  [ТС]     Найти произведение минимальных элементов каждой строки матрицы #5
-=ЮрА=- Спасибо, буду разбираться !
g-h
67 / 67 / 1
Регистрация: 03.06.2012
Сообщений: 176
20.06.2012, 21:26     Найти произведение минимальных элементов каждой строки матрицы #6
Цитата Сообщение от z0rde Посмотреть сообщение
Найти произведение минимальных элементов каждой строки матрицы (m x n).
0. int min = 1;
1. Найди минимальное число в первой строке
2. Это число умнож на переменную min;
3. Найди минимальное число во второй строке
4. Это число умнож на переменную min
...
...
5. Повторять до последней строки матрицы
Вот и весь алгоритм
z0rde
1 / 1 / 0
Регистрация: 27.05.2012
Сообщений: 12
20.06.2012, 23:32  [ТС]     Найти произведение минимальных элементов каждой строки матрицы #7
Цитата Сообщение от g-h Посмотреть сообщение
0. int min = 1;
1. Найди минимальное число в первой строке
2. Это число умнож на переменную min;
3. Найди минимальное число во второй строке
4. Это число умнож на переменную min
...
...
5. Повторять до последней строки матрицы
Вот и весь алгоритм
Это то понятно )) MPICH II использовать надо )
-=ЮрА=-
Заблокирован
Автор FAQ
21.06.2012, 09:29     Найти произведение минимальных элементов каждой строки матрицы #8
g-h, алгоритм который я представил именно по такой схеме и работал, каждая
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
//Сама thread-нить организующая вычисление мин элемента в строке
void getMinElem(void * lpParam);
искала мин элемент в строке матрицы и записывало его начение в соответствующее поле
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
pData->minElem
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2013, 22:51     Найти произведение минимальных элементов каждой строки матрицы
Еще ссылки по теме:

Найти среднее арифметическое элементов каждой строки матрицы Q (lm) и отнять его от элементов этой строки. размер матрицы 7х7.заранее спасибо C++
8. Найти среднее арифметическое элементов каждой строки матрицы Q(l,m) и вычесть его из элементов этой строки C++
C++ Для каждой строки матрицы найти произведение четных элементов и сумму нечетных

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

Или воспользуйтесь поиском по форуму:
Альфир
0 / 0 / 0
Регистрация: 20.12.2013
Сообщений: 2
20.12.2013, 22:51     Найти произведение минимальных элементов каждой строки матрицы #9
А ка на паскале написать?
Yandex
Объявления
20.12.2013, 22:51     Найти произведение минимальных элементов каждой строки матрицы
Ответ Создать тему
Опции темы

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