来自2D多维数组的子阵列

时间:2016-05-17 06:32:39

标签: c# arrays multidimensional-array

我试图将一些代码放在一起,以平均出2D多维数组的10x10子数组。

给定一个多维数组

var myArray = new byte[100, 100];

我应该如何创建每个100字节(10x10)的100个子数组。

以下是多维子阵列包含的值索引的一些示例。

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

鉴于这些子阵列,我需要对子阵列值进行平均,以便从原始字节[100,100]创建一个字节[10,10]。

我意识到这并不难以置信,但是花了4天时间调试非常低级别的代码并且现在陷入困境会让人感到欣慰。

2 个答案:

答案 0 :(得分:1)

使用此作为参考。我使用int只是为了方便使用。代码未经测试。但这个想法就在那里。

from kombu import Connection, Exchange, Queue

media_exchange = Exchange('media', type='topic', durable=False)
video_queue = Queue('video1', exchange=media_exchange, routing_key='video')

def process_media(body, message):
    print(body)
    #message.ack()

with Connection('amqp://guest:guest@localhost//') as conn:
    with conn.Consumer(video_queue, callbacks=[process_media]) as consumer:
        # Process messages and handle events on all channels
        while True:
            conn.drain_events()

看起来你是SO的新手。下次尝试发布您对该问题的尝试;最好修复你的代码。

答案 1 :(得分: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);
}

一旦我们拥有10x10阵列,使用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