繁体   English   中英

遍历n维数组

[英]Looping through a n-dimensional array

我有一个具有不同尺寸的通用多维数组。 我需要遍历它,以便为每个元素保存索引的相对数组和相对值。

对于二维数组,假设为4和5,这将是微不足道的:

        var d1 = 4;
        var d2 = 5;
        var array = Array.CreateInstance(typeof (int), new[] {d1, d2});

        //...
        // code for populating array
        //...

        for (int i = 0; i < d1; i++)
        {
            for (int j = 0; j < d2; j++)
            {
                var value = array.GetValue(new[] { i, j });
                var indices = new[] {i, j};
            }
        }

但是我需要对n个不同维度的数组执行相同的操作。 我该如何实现? 我需要实现一个递归函数吗?

访问多维数组中的所有元素并不困难。 您只需使用单个索引就可以对整个数组进行平面迭代。 棘手的部分是将此单个索引映射到相应的多维坐标。

通常,给定具有大小向量D的矩阵,此矩阵的第i个单个索引元素具有坐标向量C_i ,使得:

在此处输入图片说明

对于0 <= n < size(D)

为此, IndexToCoordinates方法为:

static int[] IndexToCoordinates(int i, Array arr)
{
    var dims = Enumerable.Range(0, arr.Rank)
        .Select(arr.GetLength)
        .ToArray();

    Func<int, int, int> product = (i1, i2) => i1 * i2;

    return dims.Select((d, n) => (i/dims.Take(n).Aggregate(1, product))%d).ToArray();
}

现在,例如,如果您想访问多维数组中的每个项目并输出其坐标,则可以执行以下操作:

static void OutputAllArrayIndices(Array arr)
{
    var i = 0;

    foreach (int item in arr)
    {
        var coords = IndexToCoordinates(i++, arr);
        Console.WriteLine(string.Join(", ", coords));
    }
}

运行OutputAllArrayIndices(new int[3, 2, 4])然后产生:

0, 0, 0
1, 0, 0
2, 0, 0
3, 0, 0
0, 1, 0
1, 1, 0
2, 1, 0
3, 1, 0
0, 0, 1
1, 0, 1
2, 0, 1
3, 0, 1
0, 1, 1
1, 1, 1
2, 1, 1
3, 1, 1
0, 0, 2
1, 0, 2
2, 0, 2
3, 0, 2
0, 1, 2
1, 1, 2
2, 1, 2
3, 1, 2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM