2016-05-17 59 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