簡體   English   中英

訪問相鄰小區中的數據

[英]Accessing data in neighbor cells

我有一個大小為mxn的矩陣M ,它保存為長度為m * n的一維數組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的中心單元的所有整數變量來訪問大小為s的數據點D的數組。 大小s可能非常大。

我的觀點很清楚:不是在所有數據點上都這樣循環

for(int i=0; i<s; i++)
// Do something with D[i]

我想要類似的東西(但更緊湊)

// 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]]

等等。 對於所有單元格,我必須執行9次。

我的問題:給定結構N是否有更好的方法呢?

我不確定我是否很好地理解了您的問題....但是您可以嘗試:

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]]
    }
}

請注意,您的索引很可能超出了這種方法的范圍,因此您必須實施測試以防止這種情況的發生。

這就是使用double for循環簡單地對單元及其8個鄰居進行迭代的方法。 如果不是您所期望的,請告訴我,我將進行編輯/刪除。

我不確定,但也許您正在尋找這樣的東西:

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]
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM