C卷积矩阵

时间:2020-08-02 02:39:10

标签: c matrix new-operator

我试图创建一种将矩阵与内核进行卷积的算法,我试图使用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来控制内核,我确实需要答案< / p>

1 个答案:

答案 0 :(得分:1)

带有内核的2D数组的离散convolution导致另一个2D数组:

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

其中,j和k的总和超过内核的非零占用面积。这是您要实现的计算。

请注意,in[x - j, y - k]有时可能指向未定义输入数组的边界元素。因此,通常需要使用boundary handling方法,例如假设边界元素为零或输入的某些外推法。

研究信号处理库如何处理卷积可能会有所帮助。它们如何表示输入和输出,边界选项等: