在元素高于阈值的二维数组中查找子二维数组的索引

Finding the indices of a sub 2D array in a 2D array whose elements are above a thershold value

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

给定一个阈值,一个 NxM 大小的数组填充了双倍大小的数据 ("arr") 和一个更小的 (k+1)x(k+1) "window”(子数组,k

我想到了以下实现:

  1. 运行在 arr 上循环两个 for 直到到达 row - win 和 col - win。
  2. 对于每一行和列的值,运行另外 2 个 for 循环,其停止条件等于 window 大小。
  3. 对整个 window 的值求和,完成后检查总和是否 >= 阈值
  4. 如果这样将行和列存储在数组中,则打破循环并return数组
    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 window(2x2):

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

子数组元素的总和将为 35,函数将 return 索引: 行 = 1 和列 = 1

对我来说,这个实现使用 4 个 for 循环非常笨拙而且不够优雅。但是我在 C 方面没有太多经验,再次感谢任何帮助和反馈

你能推荐一个更好的方法来解决这个问题吗?

一般来说,C 在数组操作方面不会给你太多帮助,所以这看起来是一个很好的实现。我可能会将 window 上的循环移动到一个单独的函数以提高可读性,但在其他方面是一样的。

话虽如此,在 window 较大的情况下,它看起来像是一种可以使用求和区域 table 加快速度的操作。

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