当前位置: 首页 > 知识库问答 >
问题:

用于计算子矩阵中所有元素之和的平均值的函数[闭合]

卢光誉
2023-03-14

我想让一个函数包含三个参数

  1. 二维数组。(整数数组[行][列])
  2. 整数。(int n)
  3. 数组[i][j]的地址。

表示我的函数原型应该像这样double Sub_avg(int arr[rows][cols],int n,int*arr[i][j])

功能说明

>

  • 第一个参数是2D数组,表示要处理的数据。

    这里的n代表n×n矩阵,是指需要所有元素平均的方阵的维数。

    最后一个参数int arr[i][j]是子矩阵第一个元素的地址。

    样本输入

    • 例如,我们取3x3矩阵,
    • 我要计算子矩阵

    输出

    • 则函数将返回8.25,即(8+7+9+9)/4。
    1. 是否有用于此类计算的库函数或模板?
    2. 是否有其他方法获得解决方案?
  • 共有1个答案

    岳出野
    2023-03-14

    当然,通常在C++中,您会使用std::vector或std::array来存储数组并传递它们。但是如果您真的需要使用普通的旧数组和指针,那么我将提供您的任务的下一个解决方案。此外,当传递纯数组时,您可以使用模板魔术,但我认为您希望有一些非常简单的东西。

    我对您的函数界面进行了最小化修改,使其足以解决使用普通数组和指针的任务。应该以int const*的形式传递数组,因为在C/C++中,如果没有模板魔法,就不能传递int arr[rows][cols];而且,函数不知道数组的维数,所以必须传递rowscols;另外,不应该传递指向子数组的指针,而应该传递sub_rowsub_col在数组中的位置。

    同时,我决定实现sub_avg2()函数,它与函数的接口非常接近,但它更高级和复杂,因为它使用模板。此外,由于模板的存在,这意味着函数的主体应该只放在库的header.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
    
     类似资料:
    • 问题内容: 我必须计算矩阵(二维数组)中大于200的所有值。 我为此写下的代码是: 是一幅图像,我将其转换为矩阵,然后查找值。 我的问题是,有没有更简单的方法可以做到这一点? 问题答案: 该功能是您的朋友。因为它是为充分利用数组数据类型而实现的,所以对于大图像,您应该注意到与提供的纯python解决方案相比,速度有所提高。 直接使用numpy.where将产生一个布尔掩码,指示某些值是否符合您的条

    • 我在添加数组的所有元素以及求取它们的平均值时遇到了问题。我将如何做到这一点并用我当前拥有的代码实现它?这些元素应该定义如下。

    • 问题内容: 我在添加数组的所有元素以及将它们取平均值时遇到了问题。我该怎么做,并用我现在拥有的代码实现它?这些元素应该定义如下。 问题答案: var sum = 0; for( var i = 0; i < elmt.length; i++ ){ sum += parseInt( elmt[i], 10 ); //don’t forget to add the base } 只需遍历数组,因为您的

    • A=矩阵(c(1,2,3,0,2,2,0,2,3),nrow=3,ncol=3) B=矩阵(c(1,2,3,1,4,2,2,1),nrow=3,ncol=3) C=A B/(总和差为零) C=矩阵(c(1,2,3, 1, 3, 2, 2,2 ,2),nrow=3,nco=3) 我需要对N个矩阵的列表执行此操作(mat_vect[[I]]): 求和矩阵并得到平均值 这里是所有数字的除法,包括零。我不

    • 问题内容: 我有一维列表如下: 我要列出以下元组,并分别计算每个元组的平均值。 预期结果应为: 这样做更简单的方法是什么? 问题答案: 将数据放入形状为(2,2,2,2)的4-d numpy数组中,然后取轴1和3上该数组的平均值: 如果需要最终结果作为一维数组,则可以使用该方法: 请参阅如何对numpy数组的2x2子数组的平均值进行矢量化处理?对于类似的问题。

    • 示例数据: 我想计算每个唯一列名称的平均值和标准偏差(忽略NA)以获得如下输出: 可再现数据: 我得到的最接近的是 这是我从这篇文章中得到的,但我不知道如何调整它来得到我想要的。我知道我可以取rowmeans的平均值来得到每组的平均值,但这不适用于标准差。