2016-05-17 43 views
1

我遇到了一個試圖放置在一起的一些代碼來平均出一個2D多維數組的10x10子數組。來自2D多維數組的子數組

給定一個多維數組

var myArray = new byte[100, 100]; 

我應該如何去創造100子陣列的100個字節(10×10),每個。

下面是來自多維的子陣列將包含的值索引的一些示例。

  [x1,y1,x2,y2] 
Subarray1[0,0][9,9] 
Subarray2[10,10][19,19] 
Subarray3[20,20][29,29] 

鑑於這些子陣,然後,我會需要平均子陣列值來創建從原始字節[100,100]一個byte [10,10]。

我意識到這不是難以置信的困難,但花了4天時間調試非常低級的代碼,現在陷入了這一點會感激一些新鮮的眼睛。

回答

1

以此作爲參考。爲了易用,我使用了整數。代碼未經測試。但是這個想法就在那裏。

 var rowSize = 100; 
     var colSize = 100; 
     var arr = new int[rowSize, colSize]; 
     var r = new Random(); 
     for (int i = 0; i < rowSize; i++) 
      for (int j = 0; j < colSize; j++) 
       arr[i, j] = r.Next(20); 
     for (var subcol = 0; subcol < colSize/10; subcol++) 
     { 
      for (var subrow = 0; subrow < colSize/10; subrow++) 
      { 
       var startX = subcol*10; 
       var startY = subrow*10; 

       var avg = 0; 

       for (var x=0; x<10; x++) 
        for (var y = 0; y < 10; y++) 
         avg += arr[startX + x, startY + y]; 

       avg /= 10*10; 
       Console.WriteLine(avg); 
      } 
     } 

看起來你是新來的SO。下次嘗試發佈你的問題的嘗試;最好修復你的代碼。

1

唯一的挑戰是搞清楚函數,給定我們試圖填充的子數組索引,會給你原來的100x100數組中的正確的行和列索引;其餘的將只是複製值的問題:

// psuedocode 
// given a subarrayIndex of 0 to 99, these will calculate the correct indices 
rowIndexIn100x100Array = (subarrayIndex/10) * 10 + subArrayRowIndexToPopulate; 
colIndexIn100x100Array = (subarrayIndex % 10) * 10 + subArrayColIndexToPopulate; 

我會離開它作爲一個練習,你來推斷爲什麼上面的函數正確地計算指數。

通過上述,我們可以很容易地映射值:

var subArrays = new List<byte[,]>(); 
for (int subarrayIndex = 0; subarrayIndex < 100; subarrayIndex++) 
{ 
    var subarray = new byte[10, 10]; 
    for (int i = 0; i < 10; i++) 
     for (int j = 0; j < 10; j++) 
     { 
      int rowIndexIn100x100Array = (subarrayIndex/10) * 10 + i; 
      int colIndexIn100x100Array = (subarrayIndex % 10) * 10 + j; 
      subarray[i, j] = originalArray[rowIndexIn100x100Array, colIndexIn100x100Array]; 
     } 
    subArrays.Add(subarray); 
} 

一旦我們有了10×10陣列,計算所述平均值將使用LINQ是微不足道:

var averages = new byte[10, 10]; 
for (int i = 0; i < 10; i++) 
    for (int j = 0; j < 10; j++) 
    { 
     averages[i, j] = (byte)subArrays[(i * 10) + j].Cast<byte>().Average(b => b); 
    } 

Fiddle