[英]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.