在元素位于阈值以上的2D数组中查找子2D数组的索引

问题描述

我是C语言的新手,希望能帮助您解决以下问题。 当使用matlab或python时,这是一个非常简单的问题,但是我似乎无法在C中找到一个与numpy具有类似功能函数库或matlab的基本内置函数

给出一个阈值,一个NxM大小的数组,其中填充了两倍大小的数据(“ ar ”)和一个较小的(k + 1)x(k + 1)“ 窗口”(子数组,k

我想到了以下实现:

  1. arr 上运行两个for循环,直到到达行-win和col-win。
  2. 对于每行和col值,对于停止条件等于窗口大小的循环再运行2次。
  3. 对整个窗口中的值求和,并在完成后检查sum> = threshold(阈值)
  4. 如果将行和列存储在数组中,请中断循环并返回数组
    int N = 10;
    int M = 20;
    int sum = 0;
    
    double arr[N][M];
    int k = 10;
    int threshold = 50;
    int row,col,win_row,win_col;
    
    for (row = 0; row < N - k + 1; row++) {
        for (col = 0; row < M - k + 1; coL++) {
            for (win_row = row; win_row < row + k + 1; win_row++) {
                for (win_col = col; win_col < col + k + 1; win_coL++){
                    sum += arr[win_row][win_col];
                }
            }
            if (sum >= threshold ) {
                    break;
            else {
                    sum = 0;
                }
        }
        }
    }
    
    int indx = {row,col};
    
    return indx;

例如以下4x5数组,阈值为30,k = 1窗口(2x2):

    arr[4][5] = { {1,4},{ 0,10,8,0 },9,{ 1,1 },}

子数组元素的总和为35,该函数将返回索引: 行= 1且col = 1

对我来说,此实现使用4 for循环填充非常笨拙,并且不够优雅。但是我没有太多的C经验,再次感谢您的帮助和反馈

您能推荐一种更好的方法解决此问题吗?

解决方法

通常,C在数组操作上不能给您太多帮助,因此,这看起来是一个不错的实现。我可能会将窗口上的循环移到一个单独的函数上以提高可读性,但在其他方面还是一样的。

话虽如此,它看起来像是一种操作,您可以在窗口较大的情况下使用求和的面积表来加快速度。

https://en.wikipedia.org/wiki/Summed-area_table