计算子矩阵中所有元素总和的平均值的函数
Function to calculate average of Sum of all elements in sub-matrix
我想制作一个接受三个参数的函数
- 二维数组。 (整数数组[行][列])
- 一个整数。 (int n)
- 数组[i][j]的地址。
意味着我的函数原型应该是这样的double Sub_avg(int arr[rows][cols], int n, int *arr[i][j])
函数说明
第一个参数是二维数组,表示将要处理的数据。
这里n
表示n x n矩阵表示方阵的维数,求所有元素的平均值
最后一个参数int arr[i][j]
是子矩阵第一个元素的地址
示例输入
- 例如让我们取 3x3 矩阵,
- 我要计算子矩阵
输出
- 那么函数将 return 8.25 即 (8 + 7 + 9 + 9)/4。
- 有这种计算的库函数或模板吗?
- 我主要关心的是如何在 运行 时传递二维数组,因为用户要输入数组的维度。
通常在 C++ 中,您将使用 std::vector or std::array 来存储数组并传递它们。但是,如果您真的需要使用普通的旧数组和指针,那么我将提供下一个任务解决方案。此外,在传递普通数组时,您可以使用模板魔术,但我认为您想要一些非常简单的东西。
我对您的函数接口进行了最低限度的修改,使其足以解决使用普通数组和指针的任务。您应该将数组作为 int const *
传递,因为在 C/C++ 中您不能在没有模板魔法的情况下传递 int arr[rows][cols]
,而且您还必须传递 rows
和 cols
因为函数不知道数组的维度,所以也不要传递指向子数组的指针,你应该传递数组内的 sub_row
和 sub_col
位置。
我还决定实现 Sub_avg2()
函数,它非常接近你函数的接口,但它更高级和复杂,因为它使用模板。同样因为模板,这意味着你的函数体应该只放在你的库的头文件 .h
中,主体应该在编译时作为源代码可用。但额外的好处是此函数会执行额外的编译时间自动传递数组维度的工作。
您还可以注意到我在代码中进行了额外的越界检查,并在出现错误时返回 0。
#include <iostream>
static double Sub_avg(int const * arr, int rows, int cols, int n, int sub_row, int sub_col) {
if (!arr || rows < 0 || cols < 0 || n < 0 || sub_row < 0 || sub_col < 0 || sub_row + n > rows || sub_col + n > cols)
return 0; // Just out of bounds checking. Return error.
double sum = 0;
for (size_t i = 0; i < n; ++i)
for (size_t j = 0; j < n; ++j)
sum += arr[(sub_row + i) * cols + sub_col + j];
return sum / double(n * n);
}
template <int rows, int cols>
static double Sub_avg2(int const (&arr)[rows][cols], int n, int const * sarr) {
int sub_row = (sarr - &arr[0][0]) / cols, sub_col = (sarr - &arr[0][0]) % cols;
if (!arr || rows < 0 || cols < 0 || n < 0 || sub_row < 0 || sub_col < 0 || sub_row + n > rows || sub_col + n > cols)
return 0; // Just out of bounds checking. Return error.
double sum = 0;
for (size_t i = 0; i < n; ++i)
for (size_t j = 0; j < n; ++j)
sum += arr[sub_row + i][sub_col + j];
return sum / double(n * n);
}
int main() {
int const rows = 3, cols = 3, n = 2, sub_row = 1, sub_col = 1;
int arr[rows][cols] = {{3, 5, 6}, {5, 8, 7}, {5, 9, 9}};
std::cout << Sub_avg((int*)arr, rows, cols, n, sub_row, sub_col) << std::endl;
std::cout << Sub_avg2(arr, n, &arr[sub_row][sub_col]) << std::endl;
}
输出:
8.25
8.25
我想制作一个接受三个参数的函数
- 二维数组。 (整数数组[行][列])
- 一个整数。 (int n)
- 数组[i][j]的地址。
意味着我的函数原型应该是这样的double Sub_avg(int arr[rows][cols], int n, int *arr[i][j])
函数说明
第一个参数是二维数组,表示将要处理的数据。
这里
n
表示n x n矩阵表示方阵的维数,求所有元素的平均值最后一个参数
int arr[i][j]
是子矩阵第一个元素的地址
示例输入
- 例如让我们取 3x3 矩阵,
- 我要计算子矩阵
输出
- 那么函数将 return 8.25 即 (8 + 7 + 9 + 9)/4。
- 有这种计算的库函数或模板吗?
- 我主要关心的是如何在 运行 时传递二维数组,因为用户要输入数组的维度。
通常在 C++ 中,您将使用 std::vector or std::array 来存储数组并传递它们。但是,如果您真的需要使用普通的旧数组和指针,那么我将提供下一个任务解决方案。此外,在传递普通数组时,您可以使用模板魔术,但我认为您想要一些非常简单的东西。
我对您的函数接口进行了最低限度的修改,使其足以解决使用普通数组和指针的任务。您应该将数组作为 int const *
传递,因为在 C/C++ 中您不能在没有模板魔法的情况下传递 int arr[rows][cols]
,而且您还必须传递 rows
和 cols
因为函数不知道数组的维度,所以也不要传递指向子数组的指针,你应该传递数组内的 sub_row
和 sub_col
位置。
我还决定实现 Sub_avg2()
函数,它非常接近你函数的接口,但它更高级和复杂,因为它使用模板。同样因为模板,这意味着你的函数体应该只放在你的库的头文件 .h
中,主体应该在编译时作为源代码可用。但额外的好处是此函数会执行额外的编译时间自动传递数组维度的工作。
您还可以注意到我在代码中进行了额外的越界检查,并在出现错误时返回 0。
#include <iostream>
static double Sub_avg(int const * arr, int rows, int cols, int n, int sub_row, int sub_col) {
if (!arr || rows < 0 || cols < 0 || n < 0 || sub_row < 0 || sub_col < 0 || sub_row + n > rows || sub_col + n > cols)
return 0; // Just out of bounds checking. Return error.
double sum = 0;
for (size_t i = 0; i < n; ++i)
for (size_t j = 0; j < n; ++j)
sum += arr[(sub_row + i) * cols + sub_col + j];
return sum / double(n * n);
}
template <int rows, int cols>
static double Sub_avg2(int const (&arr)[rows][cols], int n, int const * sarr) {
int sub_row = (sarr - &arr[0][0]) / cols, sub_col = (sarr - &arr[0][0]) % cols;
if (!arr || rows < 0 || cols < 0 || n < 0 || sub_row < 0 || sub_col < 0 || sub_row + n > rows || sub_col + n > cols)
return 0; // Just out of bounds checking. Return error.
double sum = 0;
for (size_t i = 0; i < n; ++i)
for (size_t j = 0; j < n; ++j)
sum += arr[sub_row + i][sub_col + j];
return sum / double(n * n);
}
int main() {
int const rows = 3, cols = 3, n = 2, sub_row = 1, sub_col = 1;
int arr[rows][cols] = {{3, 5, 6}, {5, 8, 7}, {5, 9, 9}};
std::cout << Sub_avg((int*)arr, rows, cols, n, sub_row, sub_col) << std::endl;
std::cout << Sub_avg2(arr, n, &arr[sub_row][sub_col]) << std::endl;
}
输出:
8.25
8.25