2011-07-18 28 views
0

私は、列ランクと行ランクが常に等しく、4で均等に分割された大きな2D行列A2Dを持っています。列ランクと行ランクの両方をそれぞれのクォータ(1 /別のマトリックスB2Dを形成する。各B2D要素は、A2Dの4×4サブ行列の平均である。私が何をしたいのかを明確に説明するために、私は単純な8x8行列をとり、あなたの参照のために次のコードスニペットを提供します。私の解決策は非常に不器用です。あなたはより良いパフォーマンスでもう一つの解決策を私に見せてください。前もって感謝します。行列計算

int arr[8][8] =  
{ 
    {11, 12, 13, 14, 15, 16, 17, 18}, 
    {21, 22, 23, 24, 25, 26, 27, 28}, 
    {31, 32, 33, 34, 35, 36, 37, 38}, 
    {41, 42, 43, 44, 45, 46, 47, 48}, 
    {51, 52, 53, 54, 55, 56, 57, 58}, 
    {61, 62, 63, 64, 65, 66, 67, 68}, 
    {71, 72, 73, 74, 75, 76, 77, 78}, 
    {81, 82, 83, 84, 85, 86, 87, 88} 
}; 

int** pColAvg = new int* [8]; 

for (int i = 0; i < 8; i++) 
    pColAvg[i] = new int[2]; 

for (int nRow = 0; nRow < 8; nRow + 4) 
{ 
    for (int nCol = 0; nCol < 8; nCol + 4) 
    { 
     int Avg = 0; 
     Avg += arr[nRow][nCol]; 
     Avg += arr[nRow][nCol + 1]; 
     Avg += arr[nRow][nCol + 2]; 
     Avg += arr[nRow][nCol + 3]; 
     Avg /= 4; 

     pColAvg[nRow][nCol/4] = Avg; 
    } 
} 

int** pAvgArray = new int* [2]; 

for (int i = 0; i < 2; i++) 
    pAvgArray[i] = new int[2]; 

for (int nRow = 0; nRow < 8; nRow + 4) 
{  
    for (int nCol = 0; nCol < 2; nCol++) 
    { 
     int Avg = 0; 
     Avg += pColAvg[nRow][nCol]; 
     Avg += pColAvg[nRow + 1][nCol]; 
     Avg += pColAvg[nRow + 2][nCol]; 
     Avg += pColAvg[nRow + 3][nCol]; 
     Avg /= 4; 

     pAvgArray[nRow/4][nCol] = Avg; 
    } 
} 

for (int i = 0; i < 8; i++)  
    delete [] pColAvg[i]; 

delete [] pColAvg; 

for (int i = 0; i < 2; i++)  
    delete [] pAvgArray[i]; 

delete [] pAvgArray; 
+0

がそれですC++またはC? – Wok

+0

STLは許可されていますか? – Wok

+0

@wok:C++とSTLが許可されています。 – GoldenLee

答えて

2

あなたの解決策は(たとえ平均的には平均床面積を意味するとしても)間違っていると思います。私の解決策は次のとおりです。

int** solveIt(int **arr, int n){ 
    int **result = new int*[n/4]; 
    for(int i=0; i<n; i+=4){ 
     result[i] = new int[n/4]; 
     for(int j=0; j<n; j+=4){ 
      int sum = 0; 
      for(int k=0; k<4; k++) 
       for(int q=0; q<4; q++) 
        sum += arr[i+k][j+q]; 
      result[i/4][j/4] = sum/16; 
     } 
    } 
    return result; 
} 

これは、その配列の配列とサイズをとり、結果配列を返す関数です。

編集: とあなたのソリューションが動作しない例:

1 1 1 1 
1 1 1 2 
1 1 1 1 
1 1 0 1 

答えは次のとおりです。

1 

が、あなたのソリューションを提供します:

0 
+0

ありがとう!あなたのソリューションが私のために適切であると確信しています。私のリモートセンシング機器には検出器があります。各検出器は、ある時間間隔で2500本のラインを走査することができ、各走査ラインは10000ピクセルを有する。ユーザーは4つの検出器の観測値を組み合わせて、高解像度(10000x10000)の画像を作成できます。一方、ユーザは、4つの観測値を平均化することによって、低いresulotion(2500x2500)を得ることもできます。 – GoldenLee

+0

条件:私はすでに高解像度のマトリックスを持っています。低解像度で別のものを欲しい。 – GoldenLee