我正在处理动态维数组,我必须创建一个删除指定维度的方法,以便数组中所有元素的总和不会改变。
例如:
[[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]
答案 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