2016-02-25 53 views
0

我正在处理动态维度的数组,我必须创建一个方法来删除指定的维度,以便数组中所有元素的总和不会发生变化。从阵列中删除尺寸

例如:

[[18, 7], [11,19]] 

卸下尺寸0的结果[29,26] 在[25,30]

卸下维1分的结果我已经使用了行优先顺序转换为平面阵列和计算补偿:

int offset = dimensionIndices[dimensionSizes.length - 1]; 
      for (int d = dimensionSizes.length - 2; d >= 0; --d) { 
      offset = offset * dimensionSizes[d] + dimensionIndices[d]; 
      } 
      return offset; 

我真的不确定如何继续删除维度和分布其他元素的值。

我会很感激有关如何去做这件事的一些建议。

更新一些3D例如:

array = createArray(2, 2, 2); 
     int value = 0; 
     for (int i = 0; i < 2; i++) { 
      for (int j = 0; j < 2; j++) { 
       for (int k = 0; k < 2; k++) { 
        array.setValue(value, i, j, k); 
        ++value; 
       } 
      } 
     } 

代表以行优先顺序结果:

[0, 4, 2, 6, 1, 5, 3, 7] 

除去尺寸0应该给:

[4, 8, 6, 10] 

拆除尺寸1应该给:

[2, 4, 10, 12] 

删除尺寸2应该给:

[1, 9, 5, 13] 
+0

因此,用它们的总和替换每个内部数组? – Aleksandar

+0

你能比2x2更高的尺寸吗?如何在3x3上移除尺寸? – Aleksandar

+0

@Aleksandar我已编辑包含3D示例 – Benirving92

回答

1

玩了一段时间后,我来到了这个变种:

public int[] removeDimension(final int dim) { 
     /** 
     * flatArray - original row-major order 1D representative of ND matrix 
     * dimLength - length of one side 
     * dimCount - number of dimensions 
     */ 
     final int[] result = new int[flatArray.length/dimLength]; 
     for (int i = 0; i < flatArray.length; i++) { 
      /** 
      * construct array of original indexes, used to fill this value. 
      * replace dimension which should be removed with -1. 
      */ 
      final int[] indexes = new int[dimCount]; 
      for (int j = (dimCount - 1), ti = i; j >= 0; j--) { 
       indexes[j] = (j == dim) ? -1 : (ti % dimLength); 
       ti /= dimLength; 
      } 

      /** 
      * construct final index in N-1D matrix, just skip removed dimension. 
      */ 
      int idx = 0; 
      for (final int index : indexes) { 
       if (index != -1) { 
        idx = (idx * dimLength) + index; 
       } 
      } 
      // summarize values into cell 
      result[idx] += flatArray[i]; 
     } 
     return result; 
    } 

二维测试数据,它返回:

29 26 
25 30 

为3D测试数据:

4 6 8 10 
2 4 10 12 
1 5 9 13