C中的多维数组3x3平均值

Posted

技术标签:

【中文标题】C中的多维数组3x3平均值【英文标题】:Multidimensional Array 3x3 Average in C 【发布时间】:2022-01-09 07:57:13 【问题描述】:

我被我的 C 程序困住了,我必须通过一个函数来计算多维数组的平均值。

假设您有以下数组:

array[5][8];

我已经能够通过函数计算整个数组的平均值。 但是,在练习中,您必须计算 5x8 数组内的 3x3 维数组的平均值,并且必须将结果写入另一个数组。

它应该看起来像这样(意味着 3x3 矩阵可以重叠):

这就是我的函数到目前为止的样子(它只是计算整个矩阵的总和)。用户可以决定数组的大小和值。

void matavg(float *matrixIn, float *matrixOut, int rows, int cols, float *avg) 


float sum = 0;

for (int i = 0; i < rows; i++) 
    for (int j = 0; j < cols; j++) 
        sum += *(matrixIn+i * cols+j);

    



*avg = sum /(rows*cols);

如何重写我的函数,以便在输入数组内连续计算 3x3 元素的平均值?

*matrixIn是用户创建的矩阵; *matrixOut 应该是具有平均值的矩阵。

【问题讨论】:

对于每个目标元素,将源数组中对应的 3×3 元素的值相加,然后除以 9。 获取每个可能的 3x3 矩阵左上角的坐标。迭代所有这些坐标,这意味着迭代整个矩阵的两侧减去 2。现在在两个单独的(嵌套)循环中,对于每个“左上角”,x 和 y 坐标都从 0 迭代到 2(然后添加到“左上角”的坐标。将所有数字相加并除以 9。将其放入目标数组中“左上角”的坐标处。 查找卷积。 【参考方案1】:
//sq - size of the square subarray. 
void matavg3x3(size_t rows, size_t cols, size_t sq, float (*matrixIn)[cols], float (*matrixOut)[sq]) 

    for(size_t rowstart = 0; rowstart <= rows - sq; rowstart++)
    
        for(size_t colstart = 0; colstart <= cols - sq; colstart++)
        
            double sum = 0.0;
            for(size_t row = 0; row < sq; row++)
            
                for(size_t col = 0; col < sq; col++)
                
                    sum += matrixIn[rowstart + row][colstart + col];
                                
            
            matrixOut[rowstart][colstart] = sum / (sq * sq);
        
    

【讨论】:

float *matrixOut 结合 matrixOut[rowstart][colstart] 看起来像是编译错误 @tstanisl 确实忘了修改第一行

以上是关于C中的多维数组3x3平均值的主要内容,如果未能解决你的问题,请参考以下文章

Java多维数组平均

从 C 中的函数返回多维数组

如何针对 C、C++ 或 Fortran 中的另一个多维数组快速对多维数组进行十亿点排序?

C多维数组中的指针地址

C中的多维数组:它们是锯齿状的吗?

C/C++编程笔记:数组和字符串丨多维数组详解