行主要订单地址计算

时间:2016-02-21 21:53:12

标签: java arrays data-structures

我正在计算转换为平坦1d数组的n维数组的索引。

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

我已经编写了这个代码,它出现并且测试正确。虽然我已经从维基百科编写了公式,但我并不完全了解正在发生的事情。我很感激有人解释这个,甚至更好地链接关于地址计算的视频教程/讲座。

1 个答案:

答案 0 :(得分:2)

让我们手动完成前几个维度。

对于1d数组(单行),元素[k]位于k位置。

对于二维数组,元素[j,k]指定行k的{​​{1}}第三个元素。这是j。第j行的开头位于k + start of row j。如果维度列在数组j * number of columns中,则列数为dimensionSize

将这些放在一起,元素dimensionSize[0]位于[j,k]

对于3d数组,元素dimensionSize[0] * j + k指定&#34; plane&#34;中的行[i,j,k]的{​​{1}}&#39;元素。元素立方体的k。这是j。平面i中第j行的开始是i。将这些放在一起,元素k + start of row j in plane i位于

i * size of plane + j * size of row

另一种写作方式是

[i,j,k]

这种模式正在出现。如果我们有一个4d数组,则元素dimensionSize[0] * dimensionSize[1] * i + dimensionSize[0] * j + k. 将是

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

现在用数组[h,i,j,k]替换索引k,j,i,h,你应该能够看到该函数正在为任意数量的维度进行此计算。

更简单的编码是:

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