2
저는 C 언어로 행렬의 컨볼 루션을 시도하고 있습니다.C - 2D Convolution
나는 뭔가를 시도했지만 제대로 할 수 없습니다.
N[WIDTH1][WIDTH2]
은 입력 행렬이고, M[MASK_WIDTH1][MASK_WIDTH2]
은 커널 행렬이고 P[][]
출력 행렬입니다.
첫 번째 시도 :
void convolution_2D(int N[][WIDTH2], int M[][MASK_WIDTH2], int P[][WIDTH2]) {
// find center position of kernel (half of kernel size)
int kCenterX = MASK_WIDTH2/2;
int kCenterY = MASK_WIDTH1/2;
for (int i = 0; i < WIDTH1; ++i) // rows
{
for (int j = 0; j < WIDTH2; ++j) // columns
{
for (int m = 0; m < MASK_WIDTH1; ++m) // kernel rows
{
int mm = MASK_WIDTH1 - 1 - m; // row index
for (int n = 0; n < MASK_WIDTH2; ++n) // kernel columns
{
int nn = MASK_WIDTH2 - 1 - n; // column index
// index of input signal, used for checking boundary
int ii = i + (m - kCenterY);
int jj = j + (n - kCenterX);
// ignore input samples which are out of bound
if (ii >= 0 && ii < WIDTH1 && jj >= 0 && jj < WIDTH2)
P[i][j] += N[ii][jj] * M[mm][nn];
}
}
}
}
문제는 내가 M 행렬의 잘못된 값을 선택하기 때문에 경계 값이 잘못된 것입니다. 예를 들어, P[0][0]
대한 결과와 N
P
및 5 × 3 × M
들어 같아야
P[0][0] = N[0][0]*M[1][1] + N[0][1]*M[1][2] + N[1][0]*M[2][1] + N[1][1]*M[2][2];
I 하부 오른쪽 부분 필요한 커널의 값; 그 코드는 왼쪽 상단 부분을 선택하고 올바른 값을 검사하는 코드를 작성할 수 없습니다.
이 코드는 함수가 호출 될 때 P의 모든 값이 0으로 초기화하는 것으로 가정합니다. – samgak
mm 및 nn의 요점은 무엇입니까? 방금 m과 n을 사용하면 작동 할 것 같습니다. – samgak
예, P는 0으로 초기화됩니다. 나는 바보 같지만 .... 나는 그것이 효과가 있다고 생각한다. 출력 값을 확인하고 질문을 닫을 것입니다. 고맙습니다! 편집 : 작동합니다! – Pleasant94