从数组中删除维度

时间:2016-02-25 19:10:36

标签: java arrays

我正在处理动态维数组,我必须创建一个删除指定维度的方法,以便数组中所有元素的总和不会改变。

例如:

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

删除维度0导致[29,26] 删除维度1会导致[25,30]

我使用行主要顺序转换为平面数组并计算偏移量:

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]

1 个答案:

答案 0 :(得分: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;
    }

返回的2D测试数据:

29  26  
25  30

用于3D测试数据:

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