Java 行主订单地址计算
我正在计算一个n维数组转换成平面1d数组的索引Java 行主订单地址计算,java,arrays,data-structures,Java,Arrays,Data Structures,我正在计算一个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(di
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;
}
private int-toFlatindex(int…dimensionindex){
int指数=0;
对于(int k=dimensionindex.length-1;k>=0;k--){
//检查指定的索引是否在数组的边界内
如果(维数索引[k]<0 | |维数索引[k]>=维数大小[k]){
返回-1;
}
//使用以下公式获取平面数组中的索引:https://en.wikipedia.org/wiki/Row-major_order#Address_calculation_in_general
int start=1;
对于(int l=尺寸大小。长度-1;l>=k+1;l--){
开始=开始*尺寸[l];
}
索引+=维度索引[k]*开始;
}
收益指数;
}
我已经写了这段代码,它看起来是正确的,测试结果是正确的。虽然我已经从维基百科中编码了这个公式,但我并不完全理解发生了什么。我希望有人能解释这一点,或者更好地链接关于地址计算的视频教程/讲座。让我们手动完成前几个维度 对于单行的一维数组,元素
[k]
位于位置k
对于二维数组,元素[j,k]
指定行j
的第k个元素。这是k+第j行的开头
。第j行的开头是j*列数
。如果尺寸列在数组dimensionSize
中,则列数为dimensionSize[0]
综上所述,元素[j,k]
的尺寸为尺寸[0]*j+k
对于三维数组,元素[i,j,k]
指定元素立方体的“平面”内i
行j
的第k个元素。这是平面i中j行的k+起点
。平面i中第j行的起点为i*平面尺寸+j*行尺寸
。综上所述,元素[i,j,k]
位于
dimensionSize[0] * dimensionSize[1] * i + dimensionSize[0] * j + k.
另一种写法是
dimensionSize[0] * (dimensionSize[1] * i + j) + k.
这种模式正在形成。如果我们有一个4d数组,元素[h,i,j,k]
将是
dimensionSize[0] * (dimensionSize[1] * (dimensionSize[2] * h + i) + j) + k
现在用数组dimensionindex[0..3]
替换索引k、j、i、h,您应该能够看到该函数正在对任意数量的维度执行此计算
更简单的编码是:
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;
}