有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将一维索引转换为多维数组中的相应索引?

假设我有一个3x4x5x6 java双数组a,我用以下方式将其展开为一个长度为360的数组列表b

for (int i = 0; i<a.length; i++){
    for (int j = 0; j<a[0].length; j++){
        for (int k = 0; k<a[0][0].length; k++){
            for (int m = 0; m<a[0][0][0].length; m++){
                b.add(a[i][j][k][m]);
            }
        }
    }
}

给定b的索引,是否有一种简单的方法可以在a中找到相应的4元组索引


共 (2) 个答案

  1. # 1 楼答案

    假设

    • b是一维数组上的索引
    • i,j,k,m是多维数组上的四个结果索引
    • si,sj,sk,sm是任何维度的大小

    你可以使用基础数学,应该是

    • m = b % sm
    • k = (b / sm) % sk
    • j = (b / (sm*sk)) % sj
    • i = b / (sm*sk*sj)

    基本上,对于包含的数组的每一个大小,将每个索引递增一(通过乘以大小),并将其包装到其维度上

  2. # 2 楼答案

    在MATLAB中,可以使用^{}将线性索引转换为下标

    例如,一个四维(3x3x3x3)矩阵:

    #% The dimensions of n-dimensional matrix:
    SizeVector = [ 3, 3, 3, 3 ];
    
    #% Example linear index:
    LinearIndex = 17;
    
    [i1, i2, i3, i4 ] = ind2sub(SizeVector, LinearIndex);
    
    i1 =
       2
    
    i2 =
       3
    
    i3 =
       2
    
    i4 =
       1
    

    要检查是否正确,您可以从以下下标手动计算原始线性地址:

     (i4-1)*3^3 + (i3-1)*3^2 + (i2-1)*3^1 + (i1-1)*3^0 + 1
    
    ans =
        17