在元素高于阈值的二维数组中查找子二维数组的索引
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
我想到了以下实现:
- 运行在 arr 上循环两个 for 直到到达 row - win 和 col - win。
- 对于每一行和列的值,运行另外 2 个 for 循环,其停止条件等于 window 大小。
- 对整个 window 的值求和,完成后检查总和是否 >= 阈值
- 如果这样将行和列存储在数组中,则打破循环并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 加快速度的操作。
我是 C 语言的新手,希望能帮助我解决以下问题。 当使用 matlab 或 python 时,这是一个非常简单的问题,但是我似乎无法在 C 中找到与 numpy 或 matlab 的基本内置函数具有相似功能的函数库。
给定一个阈值,一个 NxM 大小的数组填充了双倍大小的数据 ("arr") 和一个更小的 (k+1)x(k+1) "window”(子数组,k 我想到了以下实现: 例如对于以下 4x5 数组,阈值为 30 且 k=1 window(2x2): 子数组元素的总和将为 35,函数将 return 索引:
行 = 1 和列 = 1 对我来说,这个实现使用 4 个 for 循环非常笨拙而且不够优雅。但是我在 C 方面没有太多经验,再次感谢任何帮助和反馈 你能推荐一个更好的方法来解决这个问题吗?
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;
arr[4][5] = { {1, 0 , 0 , 4},
{ 0, 10, ,8 ,0 },
{ 0, 9, ,8 ,0 },
{ 1, 0, ,0 ,1 },
}
一般来说,C 在数组操作方面不会给你太多帮助,所以这看起来是一个很好的实现。我可能会将 window 上的循环移动到一个单独的函数以提高可读性,但在其他方面是一样的。
话虽如此,在 window 较大的情况下,它看起来像是一种可以使用求和区域 table 加快速度的操作。