0

好的,所以我试图让用户输入列数和行数,然后让输出显示一个随机数矩阵,然后是一个平滑图像矩阵,该矩阵为数组中的每个像素找到均值滤波器。现在我有它可以给我一个随机数矩阵,但平滑矩阵完全不正常。现在我写的代码只关注有 4 个邻居的整数,但很明显我做错了什么。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
// function that randomly generates numbers 
void fillArray(int a[10][20], int m, int n)
{
  int random;
  int i,j;   
      for (i=0;i<m;i++)
      {
          for (j=0;j<n;j++)
          {
                           random=rand()%100;
                           a[i][j]=random;
                           }
                           }
  }
  // function that prints the first matrix of random numbers
  void printarray (int a[10][20], int m, int n)
 {
 int i,j;
for (i=0;i<m;i++) 
{
    for (j=0;j<n;j++)
        {
                     printf("%4d", a[i][j]);
                     }
                     printf("\n");
                     }
  }
  // function that finds the mean for any number and its 4 nieghbors 
  void smooth (int a[10][20], int m, int n)
 {

 int i,j;
 for (i=1;i<m;i++) 
{
    for (j=1;j<n;j++)
    {
        a[i][j]=a[i][j]=(a[i-1][j]+a[i][j-1]+a[i+1][j]+a[i][j+1])/4;
        printf("%4d",a[i][j]);
        }
        printf("\n");
 }
 }
 int main()
{

int a[10][20];
 int m,n;
 srand(time(NULL));
 //User input
 printf("please enter number of columns and rows");
 scanf("%d %d", &m,&n);
 fillArray(a,m,n);
 printarray (a,m,n);
 printf("The smoothed image is\n");
 smooth(a,m,n);
 getch();
return 0;
}

现在,如果我输入 3 和 3,我会得到这样的结果:

23 43 54
12 76 89
56 98 24

The smoothed image is
347373849493234343
12 23345345345
2132334565645645645

有人有什么想法吗?

4

1 回答 1

0

看起来您访问了未在随机数生成函数中初始化的 a[m][..] 和 a[..][n] (例如,因为您在 i < m 时循环并访问 i+1)。

编辑:分配值时,每个循环从 0 变为 m-1 / n-1

for (i=0;i<m;i++)
      {
          for (j=0;j<n;j++)
          {
                           random=rand()%100;
                           a[i][j]=random;
                           }
                           }

但是,当您使用这些值时,每个循环都从 1 变为 m-1/n-1,但在此循环内您使用相邻单元格(i-1、j-1、i+1、j+1)

 for (i=1;i<m;i++) 
{
    for (j=1;j<n;j++)
    {
        a[i][j]=(a[i-1][j]+a[i][j-1]+a[i+1][j]+a[i][j+1])/4;
        }
 }
 }

这意味着在最后一次迭代(i = m - 1)中,您访问未初始化的单元格,因为您访问 i+1 = m 请记住,多维数组实际上是内存中的一维数组,所以有些这些调用中的一些并不是真正针对未初始化的值,但有些是

要解决此问题,您可以在分配阶段循环直到 m/n(而不是 m-1/n-1)

于 2012-09-30T04:26:29.047 回答