愚蠢的矩阵技巧
这可能不是您要寻找的答案,但我认为这很有趣。这是一个纯粹的数学解决方案,因为我的 pdl 技能很无聊(哈!我打赌每个人都在开玩笑),因此我没有做任何基准测试来看看它是否比双循环更快。
让我们像这样定义一个矩阵W:
[0 0 1]
W = [0 1 0]
[1 0 0]
W 是交换矩阵。 (不知道为什么我把它叫做 W 而不是 S,但你去吧。)如果你有另一个 3x3 矩阵 M 并乘以 W x M,它会交换 @987654326 的 rows @。如果您将M x W 相乘(更改顺序),它会交换M 的列。
使用上面的矩阵,我们可以像这样交换行:
[0 0 1] [1 2 3] [7 8 9]
W x M = [0 1 0] x [4 5 6] = [4 5 6]
[1 0 0] [7 8 9] [1 2 3]
所以要将原始矩阵逆时针旋转 90°,我们知道我们需要转置它然后交换行(M' 是 M-transpose):
[0 0 1] [1 4 7] [3 6 9]
W x M' = [0 1 0] x [2 5 8] = [2 5 8]
[1 0 0] [3 6 9] [1 4 7]
正如我之前所说,乘以M x W 将交换M 的列:
[1 2 3] [0 0 1] [3 2 1]
M x W = [4 5 6] x [0 1 0] = [6 5 4]
[7 8 9] [1 0 0] [9 8 7]
这恰好是先前结果W x M' 的转置!最后一步,我们有:
[1 4 7] [0 0 1] [7 4 1]
M' x W = [2 5 8] x [0 1 0] = [8 5 2]
[3 6 9] [1 0 0] [9 6 3]
现在我们已经将M 顺时针旋转了 90°。但这只是我们原始结果W x M的转置。
对于我们的 90° 旋转,我们有两种方法来生成每个结果:
Rotate counterclockwise: W x M' = (M x W)'
Rotate clockwise: M' x W = (W x M)'
最后,为了完整起见,要将矩阵旋转 180°,您需要交换行和列:
[0 0 1] [1 2 3] [0 0 1] [7 8 9] [0 0 1] [9 8 7]
W x M x W = [0 1 0] x [4 5 6] x [0 1 0] = [4 5 6] x [0 1 0] = [6 5 4]
[1 0 0] [7 8 9] [1 0 0] [1 2 3] [1 0 0] [3 2 1]
好吧,我想它还没有完全完整,因为我们也可以使用交换矩阵和矩阵转置来进行反射和反射旋转,但我们暂时将其留在那里。 p>