Advertisement
NikolayChukanov

mainc-2

Feb 15th, 2024
980
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.59 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>
  4. #include <time.h>
  5.  
  6. #define MATRIX_SIZE 1000 // Размер матрицы
  7. #define FILTER_SIZE 3   // Размер фильтра
  8.  
  9. double matrix[MATRIX_SIZE][MATRIX_SIZE];
  10. double matrix_erosion[MATRIX_SIZE][MATRIX_SIZE];
  11. double matrix_dilation[MATRIX_SIZE][MATRIX_SIZE];
  12.  
  13. void generate_matrix(double matrix[MATRIX_SIZE][MATRIX_SIZE]) {
  14.     // Инициализация генератора случайных чисел
  15.     srand(time(NULL));
  16.  
  17.     // Заполнение матрицы случайными значениями
  18.     for (int i = 0; i < MATRIX_SIZE; ++i) {
  19.         for (int j = 0; j < MATRIX_SIZE; ++j) {
  20.             matrix[i][j] = (double)rand() / RAND_MAX;
  21.             printf("%.2f ", matrix[i][j]);
  22.         }
  23.         printf("\n");
  24.     }
  25. }
  26.  
  27. // Операция эрозии
  28. void *erosion(void *arg) {
  29.     int *startRow = (int *)arg;
  30.     int endRow = (*startRow) + FILTER_SIZE;
  31.  
  32.     // Временная матрица для хранения результата эрозии
  33.     double tempMatrix[MATRIX_SIZE][MATRIX_SIZE];
  34.  
  35.     for (int i = *startRow; i < endRow; i++) {
  36.         for (int j = 0; j < MATRIX_SIZE; j++) {
  37.             double min = matrix[i][j]; // Начальное значение минимума
  38.  
  39.             // Проходимся по всем элементам ядра
  40.             for (int k = 0; k < FILTER_SIZE; k++) {
  41.                 for (int l = 0; l < FILTER_SIZE; l++) {
  42.                     // Если вышли за границы матрицы, игнорируем этот элемент ядра
  43.                     if (i + k - FILTER_SIZE/2 < 0 || i + k - FILTER_SIZE/2 >= MATRIX_SIZE ||
  44.                         j + l - FILTER_SIZE/2 < 0 || j + l - FILTER_SIZE/2 >= MATRIX_SIZE) {
  45.                         continue;
  46.                     }
  47.  
  48.                     // Обновляем минимум, если нашли меньшее значение
  49.                     if (matrix[i + k - FILTER_SIZE/2][j + l - FILTER_SIZE/2] < min) {
  50.                         min = matrix[i + k - FILTER_SIZE/2][j + l - FILTER_SIZE/2];
  51.                     }
  52.                 }
  53.             }
  54.  
  55.             // Сохраняем результат эрозии во временной матрице
  56.             tempMatrix[i - *startRow][j] = min;
  57.         }
  58.     }
  59.  
  60.     // Копируем результат эрозии из временной матрицы в выходную матрицу
  61.     for (int i = *startRow; i < endRow; i++) {
  62.         for (int j = 0; j < MATRIX_SIZE; j++) {
  63.             matrix_erosion[i][j] = tempMatrix[i - *startRow][j];
  64.         }
  65.     }
  66.  
  67.     pthread_exit(NULL);
  68. }
  69.  
  70. // Операция наращивания
  71. void *dilation(void *arg) {
  72.     int *startRow = (int *)arg;
  73.     int endRow = (*startRow) + FILTER_SIZE;
  74.  
  75.     // Временная матрица для хранения результата наращивания
  76.     double tempMatrix[MATRIX_SIZE][MATRIX_SIZE];
  77.  
  78.     for (int i = *startRow; i < endRow; i++) {
  79.         for (int j = 0; j < MATRIX_SIZE; j++) {
  80.             double max = matrix[i][j]; // Начальное значение максимума
  81.  
  82.             // Проходимся по всем элементам ядра
  83.             for (int k = 0; k < FILTER_SIZE; k++) {
  84.                 for (int l = 0; l < FILTER_SIZE; l++) {
  85.                     // Если вышли за границы матрицы, игнорируем этот элемент ядра
  86.                     if (i + k - FILTER_SIZE/2 < 0 || i + k - FILTER_SIZE/2 >= MATRIX_SIZE ||
  87.                         j + l - FILTER_SIZE/2 < 0 || j + l - FILTER_SIZE/2 >= MATRIX_SIZE) {
  88.                         continue;
  89.                     }
  90.  
  91.                     // Обновляем максимум, если нашли большее значение
  92.                     if (matrix[i + k - FILTER_SIZE/2][j + l - FILTER_SIZE/2] > max) {
  93.                         max = matrix[i + k - FILTER_SIZE/2][j + l - FILTER_SIZE/2];
  94.                     }
  95.                 }
  96.             }
  97.  
  98.             // Сохраняем результат наращивания во временной матрице
  99.             tempMatrix[i - *startRow][j] = max;
  100.         }
  101.     }
  102.  
  103.     // Копируем результат наращивания из временной матрицы в выходную матрицу
  104.     for (int i = *startRow; i < endRow; i++) {
  105.         for (int j = 0; j < MATRIX_SIZE; j++) {
  106.             matrix_dilation[i][j] = tempMatrix[i - *startRow][j];
  107.         }
  108.     }
  109.  
  110.     pthread_exit(NULL);
  111. }
  112.  
  113. int main() {
  114.     clock_t start, end;
  115.     double cpu_time_used;
  116.     //Генерация матрицы
  117.     generate_matrix(matrix);
  118.    
  119.     printf("Создание потоков\n");
  120.     pthread_t threads[MATRIX_SIZE - FILTER_SIZE + 1];
  121.     int threadArgs[MATRIX_SIZE - FILTER_SIZE + 1];
  122.  
  123.     printf("Запуск потоков для фильтрации эрозией\n");
  124.     for (int i = 0; i < MATRIX_SIZE - FILTER_SIZE + 1; i++) {
  125.         threadArgs[i] = i;
  126.         pthread_create(&threads[i], NULL, erosion, &threadArgs[i]);
  127.     }
  128.  
  129.     printf("Ожидание завершения потоков\n");
  130.     for (int i = 0; i < MATRIX_SIZE - FILTER_SIZE + 1; i++) {
  131.         pthread_join(threads[i], NULL);
  132.     }
  133.  
  134.     printf("Запуск потоков для фильтрации наращиванием\n");
  135.     for (int i = 0; i < MATRIX_SIZE - FILTER_SIZE + 1; i++) {
  136.         threadArgs[i] = i;
  137.         pthread_create(&threads[i], NULL, dilation, &threadArgs[i]);
  138.     }
  139.  
  140.     printf("Ожидание завершения потоков\n");
  141.     for (int i = 0; i < MATRIX_SIZE - FILTER_SIZE + 1; i++) {
  142.         pthread_join(threads[i], NULL);
  143.     }
  144.  
  145.     // Сохранение результатов в файл или вывод на экран
  146.     // Ваш код для сохранения результатов здесь
  147.     printf("Result of erosion:\n");
  148.     for (int i = 0; i < MATRIX_SIZE; ++i){
  149.     for (int j = 0; j < MATRIX_SIZE; ++j){
  150.        printf("%f", matrix_erosion[i][j]);
  151.         }
  152.         printf("\n");
  153.     }
  154.    
  155.     printf("Result of dilation:\n");
  156.     for (int i = 0; i < MATRIX_SIZE; ++i){
  157.     for (int j = 0; j < MATRIX_SIZE; ++j){
  158.        printf("%f", matrix_dilation[i][j]);
  159.         }
  160.         printf("\n");
  161.     }
  162.    
  163.     end = clock();
  164.     cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
  165.     printf("Программа выполнялась %.2f секунд\n", cpu_time_used);
  166.    
  167.     return 0;
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement