C语言中的中值窗

C语言中的中值窗,c,C,我写了一个代码来查找中间窗口。但是,我不能对每一个数字都视而不见。我可以使用什么来代替for循环中的大小。当我使用大小时,它也确保只有5个,边界呢?我能为boundries做些什么?谢谢你的回答。我打开了新主题,因为用户说每个主题都基于一个问题。如果我搞错了,请删除该问题,我将为当前问题添加后缀 <size of array> <size filter> <data> 8 3 0 0 0 0 0 0 0 0

我写了一个代码来查找中间窗口。但是,我不能对每一个数字都视而不见。我可以使用什么来代替for循环中的大小。当我使用大小时,它也确保只有5个,边界呢?我能为boundries做些什么?谢谢你的回答。我打开了新主题,因为用户说每个主题都基于一个问题。如果我搞错了,请删除该问题,我将为当前问题添加后缀

    <size of array>
    <size filter> 
    <data>
    8
    3
    0 0 0 0 0 0 0 0
    0 5 0 0 6 0 0 0
    0 0 0 0 0 7 0 0
    0 0 0 0 5 0 0 0
    0 0 0 5 6 0 0 0
    0 0 8 5 5 0 0 0
    0 0 0 7 0 0 9 0
    0 0 0 0 0 0 0 0

    Output:
    0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0
    0 0 0 5 5 0 0 0
    0 0 0 5 5 0 0 0
    0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0

代码中存在一些逻辑错误:

过滤时,需要四个嵌套循环:外部两个循环遍历矩阵的列和行,内部两个循环遍历过滤区域的列和行。这对你来说不应该是新闻;在回答你之前的问题时,你已经被告知了这一点

过滤区域的限制很简单:左侧和顶部索引不得低于零,右侧和底部索引必须小于sizearray。如果它们不是,请调整它们

您需要两个数组,原始数组a和包含筛选值的第二个数组。您不能就地筛选,因为如果向上和向左看,您将只看到筛选的值,而您的筛选器应始终查看原始值

错误的过滤循环分开:您从未重置计数,当然,对于您计算的每个中值,您都应该重置计数。您还可以在内部循环中计算中位数,这太频繁了。解决这个问题的一个方法是将count设置为累积过滤器值并确定中值的循环的局部

您的排序有索引错误。与其将i与i+1进行比较,不如将i与i-1进行比较。索引从1开始,soi-1`将始终生成有效的索引

您可以对数组进行排序,这对于小数组来说很好,但通常速度较慢。具有qsort,这可能对您的常规排序有用

你的中位指数也向右偏离一

还有一些风格问题:

请养成在for、while和if代码块中使用大括号的习惯。只有最内层范围中非常琐碎的代码块可以在没有大括号的情况下编写。在您的例子中,在循环之间需要做很多工作,在那里使用大括号可以很容易地添加内容

中间值中的变量结果是多余的。您分配它,然后立即丢失变量本身,因为您返回。只要回来就够了

以下是提供所需输出的代码版本:

#include <stdint.h>
#include <stdio.h>

int min(int a, int b)
{
    return a < b ? a : b;
}

int max(int a, int b)
{
    return a > b ? a : b;
}

int median(int a[], int n)
{
    int i, j;

    for (i = 1 ; i < n ; i++) {
        for (j = 1 ; j < n ; j++) {
             if (a[j] < a[j - 1]) {
                 int t = a[j];
                 a[j] = a[j - 1];
                 a[j - 1] = t;
             }
         }
    }

    if (n % 2) return a[n / 2];
    return (a[n / 2 - 1] + a[n / 2]) / 2 ;        
}

int main()
{
    int a[100][100];
    int b[100][100];
    int temp[100];
    int i, j, ii, jj;
    int sizefilter;
    int sizearray;

    scanf("%d", &sizearray);
    scanf("%d", &sizefilter);

    for(i = 0; i < sizearray; i++) {
        for(j = 0; j < sizearray; j++) {
            scanf("%d", &a[i][j]);
        }
    }

    for(i = 0; i < sizearray; i++) {
        for(j = 0; j < sizearray; j++) {
            int imin = max(0, i - sizefilter / 2);
            int imax = min(sizearray, i + sizefilter / 2 + 1);
            int jmin = max(0, j - sizefilter / 2);
            int jmax = min(sizearray, j + sizefilter / 2 + 1);
            int count = 0;

            for (ii = imin; ii < imax; ii++) {
                for (jj = jmin; jj < jmax; jj++) {
                    temp[count] = a[ii][jj];
                    count++;
                }
            }

            b[i][j] = median(temp, count);
        }
    }

    for(i = 0; i < sizearray; i++) {
        for(j = 0; j < sizearray; j++) {
            printf("%3d", b[i][j]);
        }
        printf("\n");
    }

    return 0;
}

我该怎么感谢你呢?你是大学的讲师吗?非常感谢你。
#include <stdint.h>
#include <stdio.h>

int min(int a, int b)
{
    return a < b ? a : b;
}

int max(int a, int b)
{
    return a > b ? a : b;
}

int median(int a[], int n)
{
    int i, j;

    for (i = 1 ; i < n ; i++) {
        for (j = 1 ; j < n ; j++) {
             if (a[j] < a[j - 1]) {
                 int t = a[j];
                 a[j] = a[j - 1];
                 a[j - 1] = t;
             }
         }
    }

    if (n % 2) return a[n / 2];
    return (a[n / 2 - 1] + a[n / 2]) / 2 ;        
}

int main()
{
    int a[100][100];
    int b[100][100];
    int temp[100];
    int i, j, ii, jj;
    int sizefilter;
    int sizearray;

    scanf("%d", &sizearray);
    scanf("%d", &sizefilter);

    for(i = 0; i < sizearray; i++) {
        for(j = 0; j < sizearray; j++) {
            scanf("%d", &a[i][j]);
        }
    }

    for(i = 0; i < sizearray; i++) {
        for(j = 0; j < sizearray; j++) {
            int imin = max(0, i - sizefilter / 2);
            int imax = min(sizearray, i + sizefilter / 2 + 1);
            int jmin = max(0, j - sizefilter / 2);
            int jmax = min(sizearray, j + sizefilter / 2 + 1);
            int count = 0;

            for (ii = imin; ii < imax; ii++) {
                for (jj = jmin; jj < jmax; jj++) {
                    temp[count] = a[ii][jj];
                    count++;
                }
            }

            b[i][j] = median(temp, count);
        }
    }

    for(i = 0; i < sizearray; i++) {
        for(j = 0; j < sizearray; j++) {
            printf("%3d", b[i][j]);
        }
        printf("\n");
    }

    return 0;
}