我正在计算转换为平坦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;
}
我已经编写了这个代码,它出现并且测试正确。虽然我已经从维基百科编写了公式,但我并不完全了解正在发生的事情。我很感激有人解释这个,甚至更好地链接关于地址计算的视频教程/讲座。
答案 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