2016-02-21 90 views
1

我正在計算n維數組轉換爲平面1d數組的索引。行主要訂單地址計算

private int toFlatindex(int... dimensionIndices){ 
    int index = 0; 

    for (int k = dimensionIndices.length - 1; k >= 0; k--) { 

     // Check if the specified index is within the bounds of the array 
     if(dimensionIndices[k] < 0 || dimensionIndices[k] >= dimensionSizes[k]) { 
      return -1; 
     } 

     // get the index in the flat array using the formula from https://en.wikipedia.org/wiki/Row-major_order#Address_calculation_in_general 
     int start = 1; 
     for (int l = dimensionSizes.length - 1; l >= k+1; l--) { 
      start = start * dimensionSizes[l]; 
     } 

     index += dimensionIndices[k]*start; 
    } 

    return index; 
} 

我寫了這個代碼,這似乎和測試正確的。雖然我編寫了維基百科的公式,但我並不完全理解發生了什麼。我希望有人解釋這一點,或者甚至更好地鏈接地址計算中的視頻教程/講座。

回答

2

讓我們手動完成前幾個維度。

對於1d陣列,它是單行,元素[k]位於位置k

對於二維數組,元素[j,k]指定行jk'th元素。這是k + start of row j。第j行的開頭是j * number of columns。如果尺寸列在數組dimensionSize中,那麼列數是dimensionSize[0]

把它放在一起,元素[j,k]是在dimensionSize[0] * j + k

用於3D陣列,元件[i,j,k]指定範圍內‘平面’元素的立方體的ik「日j行的元件。這是k + start of row j in plane i。我在i平面的第j行的開始是i * size of plane + j * size of row。把這個在一起,元件[i,j,k]

dimensionSize[0] * dimensionSize[1] * i + dimensionSize[0] * j + k. 

寫這的另一種方法是

dimensionSize[0] * (dimensionSize[1] * i + j) + k. 

的圖案出現。如果我們有一個四維陣列,元素[h,i,j,k]

dimensionSize[0] * (dimensionSize[1] * (dimensionSize[2] * h + i) + j) + k 

現在更換指標K,J,I,H與陣列dimensionIndices[0..3],你應該能夠看到該函數是這樣做的計算爲任意數尺寸。

一個更簡單的編碼是:

int getOffset(int [] sizes, int [] indices) { 
    int ofs = indices[sizes.length - 1]; 
    for (int d = sizes.length - 2; d >= 0; --d) { 
    ofs = ofs * sizes[d] + indices[d]; 
    } 
    return ofs; 
}