这个问题与我之前关于如何遍历多维数组的文章有些相关。
编辑:我添加了三张关于如何重新排列多维数据集的图像。第一张图显示了一个2x2x2的多维数据集,其数字设置在默认位置。第二个图像显示相同的立方体,第一列逆时针旋转。第三张图显示Z,X和Y轴。
编辑2:我改变了价值观。 编辑1:基于笔和纸的估计,我有以下循环迭代。在这种情况下,它将是上面立方体中的数字0,2,4和6。这些是应从中获取数字的Z,X和Y值:
z x y
0 0 0
0 1 0
1 0 0
1 1 0
编辑2:我已经更改了值,用zz替换了旧的z,用xx替换了旧的x。这是必需的,因为一方(容器)必须使用z值,而另一方(containerTemp)需要zz值(反向的z值)。 编辑1:数字0,2,4和6应放在以下位置,就像从上述位置取得一样:
zz xx y
1 0 0
0 0 0
1 1 0
0 1 0
编辑2:这意味着位置0 0 0(z x y)的值0将移动到位置1 0 0(zz xx y)的值4的位置。
注意:据我所知,这通常不是如何在3D矩阵中使用Z,X和Y位置,也许这就是为什么找到解决这个问题的难度。我为每个切片的立方体完成了旋转和翻转,所以我觉得我不应该改变代码的工作方式(当然,如果我认为像白痴,我会对WOW建议开放)。我只是想在矩阵操作方面做得更好,因为即使在我的职业生涯中,我也从不和这种东西坐在一起。
解决:我在我的项目中使用了以下代码。但是,该代码不适用于2x3x2分组。所以我想这个解决方案应该只用于大小相同的立方体。我会调查一下,但截至目前我的项目并不需要它。如果有人想知道更好的方式,请告诉我,因为我想了解更多!
for (int y = 0; y < yDim; y++) {
for (int z = 0; z < zDim; z++) {
for (int x = 0, zz = xDim - 1, xx = z; x < xDim; x++, zz--) {
System.out.println("["+zz+"]["+xx+"]["+y+"] = ["+z+"]["+x+"]["+y+"]");
containerTemp[zz][xx][y] = container[z][x][y];
}
}
}
答案 0 :(得分:0)
想一想 - 每次你翻转魔方时,你都会转动一片的立方体,这实际上是一个二维数组你知道怎么解决。
所以每回合你都需要:
x
,y
或z
的固定值给出例如 - y=2
将在x
上定义z
的二维数组,其中所有y
值均为2
)因此对于y=2
的情况,它将类似于(伪代码):
// defining the two-dimensional array (the "slice") from the cube-array
for (i = 0; i < N; i++) {
for (k = 0; k < N; k++) {
arr[i,k] = origArr[i,2,k]
}
}
// turning the two-dimensional array with the function we already have
turnedArr = turn(arr)
// copying the resulted two-dimensional array back to the cube
for (i = 0; i < N; i++) {
for (k = 0; k < N; k++) {
origArr[i,2,k] = turnedArr[i,k]
}
}
当然,您必须注意每个轴的索引开始迭代的位置以及您是否增加或减少等,但这是主要想法