Свернуть матрицу в C - PullRequest
       38

Свернуть матрицу в C

1 голос
/ 02 августа 2020

Я пытаюсь создать алгоритм для свертки матрицы с ядром, я пытаюсь сделать это в C, но я не понимаю, как я могу это сделать, мой код ниже:

#include <stdio.h>
#include <stdlib.h>
#define ROW 10
#define COL 10
#define DIV 10


int main(){

  int matrix1[ROW][COL], matrix2[3][3], kernel[3][3], answerx, answery, x, y;

  printf("What is the X coordinates?\n");
  scanf("%i", &answerx);
  printf("What is the Y coordinates?\n");
  scanf("%i", &answery);

  // Generate Kernel
  for(int r=0;r<3;r++){
    for(int c=0;c<3;c++){
      kernel[r][c]=rand()%DIV;
      }
  }

  // Generate User Matrix
  for(int r=0;r<ROW;r++){
    for(int c=0;c<COL;c++){
      matrix1[r][c]=rand()%DIV;
      }
  }

  x=answerx-1;
  y=answery-1;

  // Generate Matrix with Kernel
  for(int r=0;r<3;r++){
    for(int c=0;c<3;c++){
      matrix2[r][c]=matrix1[x][y]*kernel[r][c];
      }
    }
  }

  // Print Kernel
  printf("\tKernel(Filter)\n");

  for(int r=0;r<3;r++){
    for(int c=0;c<3;c++){
      printf("\t %i", kernel[r][c]);
    }
    printf("\n");
  }

  // Print User Matrix
  printf("\t User Matrix \n");

  for(int r=0;r<ROW;r++){
    for(int c=0;c<COL;c++){
      printf("\t %i", matrix1[r][c]);
    }
    printf("\n");
  }

  // Print Kernel-Matrix
  printf("\t Kernel/Matrix \n");

  for(int r=0;r<3;r++){
    for(int c=0;c<3;c++){
      printf("\t %i", matrix2[r][c]);
    }
    printf("\n");
  }

  printf("Coordiantes X: %i e Y: %i \n", answerx, answery);
}

Я действительно новичок в программировании, это упражнение для моей подготовки, но я не могу понять, как я могу управлять ядром с помощью r и c с помощью x и y, я действительно нужен был ответ

1 Ответ

1 голос
/ 07 сентября 2020

Дискретная свертка двумерного массива с ядром приводит к другому двумерному массиву:

out[x, y] = sum_j sum_k kernel[j, k] * in[x - j, y - k].

, где суммы по j и k превышают ненулевой размер ядра. Это вычисление, которое вы хотите реализовать.

Обратите внимание, что in[x - j, y - k] может в некоторых точках относиться к элементам за пределами границ, где входной массив не определен. Поэтому обычно требуется метод обработки границ , например, если предположить, что элементы вне границ равны нулю, или некоторая экстраполяция входных данных.

Возможно, вам будет полезно посмотреть, как сигнал библиотеки обработки приближаются к свертке. Как они представляют входы и выходы, параметры границ и т. Д .:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...