簡體   English   中英

二維數組平均 - 卷積 - C 程序

[英]2D Array Average - Convolution - C Program

在此處輸入圖像描述

我的程序需要幫助。 我需要它來計算 3x3 平均值,然后是 go,然后計算下一個。 這是我到目前為止所得到的,它只是計算所有的平均值,現在我被困住了……

#include <stdio.h>
#define ROWS 5
#define COLS 7

int main(void){
    float in_sum = 0;
    float *in_matrix[ROWS][COLS];
    float in_avg;

    float matr[ROWS][COLS]={{1.5, 5, 6, 12, 13, 7, 80},
                            {50, 6.5, 23, 77, 17, 8.5, 28},
                            {43.5, 78, 8, 9, 34.5, 10, 95},
                            {75, 44, 40, 29, 39, 5, 99.5},
                            {18, 86, 68, 92, 10.5, 11, 4}};

    printf("Matrix Input:\n");

        for(int i = 0; i < ROWS; i++){
            for (int j = 0; j < COLS; j++){
                printf("%.2f ", matr[i][j]);
                    if(j==6){
                        printf("\n");
                    }
            }
        }
        printf("\nMatrix Output: \n");
        int j = 0, nr = 3, nc = 3;
        for (int i = 0; i < nr; i++){
            for(j = 0; j < nc; j++){
                in_sum = in_sum + matr[i][j];
            }
        }
        in_avg = in_sum/(ROWS*COLS);
        for (int i=0; i< ROWS; i++){
            for (int j=0; j< COLS; j++){
            printf("%.2f", in_avg);
            }
            printf("\n");
        }
        in_matrix[ROWS][COLS] = &in_sum;
    return 0;
}

您共享的代碼甚至無法正常工作。 嘗試這個:

#include <stdio.h>

#define COLS 7
#define OVER 3
#define ROWS 5

float sum(size_t cols, float *matrix) {
    float s = 0;
    for(size_t row = 0; row < OVER; row++) {
        for(size_t col = 0; col < OVER; col++) {
            s += matrix[row * cols + col];
        }
    }
    return s / (OVER * OVER);
}

int main(void) {
    float matrix[ROWS][COLS] = {
        {1.5, 5, 6, 12, 13, 7, 80},
        {50, 6.5, 23, 77, 17, 8.5, 28},
        {43.5, 78, 8, 9, 34.5, 10, 95},
        {75, 44, 40, 29, 39, 5, 99.5},
        {18, 86, 68, 92, 10.5, 11, 4}
    };
    for(size_t row=0; row < ROWS - OVER + 1; row++) {
        for(size_t col=0; col < COLS - OVER + 1; col++) {
            printf("%.1f%c",
                sum(COLS, &matrix[row][col]),
                col + 1 < COLS - OVER + 1 ? ' ' : '\n');
        }
    }
}


和示例運行:

24.6 24.9 22.2 20.9 32.6
40.9 34.9 30.7 25.4 37.4
51.2 50.4 36.7 26.7 34.3

由於輸入矩陣是硬編碼的,因此可以正常工作,但如果您需要通用的 function,則應檢查輸入是否至少為 OVER x OVER 矩陣。

sum()matrix[0][0]執行 8 次加法,然后對matrix[0][1]執行另外 8 次加法。 我們顯然可以做得更好。 例如,通過保留最后的總和並減去 window 中不再存在的內容並添加現在的內容。 緩存部分結果。

當計算范圍向右移動時更新Sum值。

#define ROWS (5)
#define COLS (7)

float SumOf3Elem( const float *p ){ return p[0]+p[1]+p[2];  }
float Add4th_Sub1st( float S, const float *p ){ return S + p[3] - p[0]; }

int main()
{
    float M[ROWS][COLS] = {
        {1.5, 5, 6, 12, 13, 7, 80},
        {50, 6.5, 23, 77, 17, 8.5, 28},
        {43.5, 78, 8, 9, 34.5, 10, 95},
        {75, 44, 40, 29, 39, 5, 99.5},
        {18, 86, 68, 92, 10.5, 11, 4}
    };

    for( int Top=0; Top+2<ROWS; ++Top )
    {
        float Sum = SumOf3Elem(M[Top]) + SumOf3Elem(M[Top+1]) + SumOf3Elem(M[Top+2]);
        printf( "%f ", Sum/9.0f );

        for( int Left=0; Left+3<COLS; ++Left )
        {
            for( int i=0; i<3; ++i )
            {   Sum = Add4th_Sub1st( Sum, M[Top+i]+Left );  }

            printf( "%f ", Sum/9.0f );
        }
        printf( "\n" );
    }

    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM