首页 > 解决方案 > C中的卷积矩阵

问题描述

我试图制作一种算法来将矩阵与内核进行卷积,我正在尝试用 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 控制内核,我真的需要一个答案

标签: cmatrixnew-operator

解决方案


二维数组与核的离散卷积产生另一个二维数组:

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

其中 j 和 k 的总和超过了内核的非零足迹。这是您要实现的计算。

请注意,in[x - j, y - k]在某些时候可能会引用未定义输入数组的越界元素。所以通常需要一种边界处理方法,比如假设越界元素为零或输入的一些外推。

您可能会发现了解信号处理库如何处理卷积会很有帮助。它们如何表示输入和输出、边界选项等:


推荐阅读