我有一个大小为M
的矩阵m x n
,它保存为长度为N
的一维数组m * n
。此数组的每个单元格都包含一些整数变量,这些变量是数据点的ID。每个单元格中的整数变量数量会随着时间的推移而变化。
N[0] = {1,4,5,7}
N[1] = {2,9,3,1,7,4}
N[2] = {7,1,3,9,8}
N[3] = {6,4,2}
...
我通过使用返回
的索引函数来访问这些元素 idx = x + y * n
给定一些索引idx
我想使用相邻单元格的所有整数变量和索引为idx
的中心单元格来访问大小为{{1}的数据点D
数组}}。尺寸s
可能非常大。
要明确我的观点:而不是对所有数据点进行这样的循环
s
我想要的东西(但更紧凑)
for(int i=0; i<s; i++)
// Do something with D[i]
等等。对于所有细胞,我必须做9次。
我的问题:鉴于结构// Access central cell
idx = x + y*n;
num_Elements = Number_of_Elements_Cell(x,y);
for(int i=0; i<num_Elements; i++)
// Do something with D[N[idx][i]]
// Access right cell
idx = (x+1) + y*n;
num_Elements = Number_of_Elements_Cell(x+1,y);
for(int i=0; i<num_Elements; i++)
// Do something with D[N[idx][i]]
// Access left cell
idx = (x-1) + y*n;
num_Elements = Number_of_Elements_Cell(x-1,y);
for(int i=0; i<num_Elements; i++)
// Do something with D[N[idx][i]]
?
答案 0 :(得分:1)
我不确定我理解你的问题...... 但你可以尝试:
for (int i=-1 ; i <= 1 ; i++){
for (int j = -1 ; j <=1 ; j++){
idx = (x+i) + (y+j)*n;
// Check if idx is not out of bounds
num_Elements = Number_of_Elements_Cell(x+i,y+j);
for(int k=0; k<num_Elements; k++)
// Do something with D[N[idx][k]]
}
}
请注意,您的索引很可能是这样一种方法的超出范围,所以您必须实施一个测试来防止这种情况。
这是使用双for
循环简单地迭代单元及其8个邻居的方法。
如果它不是您所期望的,请告诉我,我将编辑/删除。
答案 1 :(得分:-1)
我不确定,但也许你正在寻找类似的东西:
var distinctDataPoints = new List<int>();
for(int z = x - 1, z <= x + 1, z++)
{
if(z < 0 || z > m)
continue;
for(int t = y-1, t <= y + 1, t++)
{
if(t < 0 || t > n)
continue;
idx = z + t * n;
for(int i = 0; i < num_Elements; i++)
{
if(!distinctDataPoints.Contains(N[idx][i])
distinctDataPoints.Add(N[idx][i])
}
}
}
for(int dpIdx = 0; dpIdx < distinctDataPoints.Count; dpIdx++)
{
//Do something with D[dpIdx]
}