使用外积返回 APL 中旋转 90、180 和 270 度的矩阵
Returning a matrix rotated by 90, 180, and 270 degrees in APL with outer product
我正在尝试编写一些 APL 代码,这些代码将采用矩阵并返回矩阵及其所有 90 度旋转。
作为一个旋转函数,我有:{(⌽∘⍉)⍣⍺⊢⍵}
,它在右边有一个矩阵,在左边有 CW 旋转数,它本身似乎工作得很好。
为了生成所有 4 个输出数组,我试过像这样使用外积:
r ← {(⌽∘⍉)⍣⍺⊢⍵}
mat2 ← (2 2 ⍴ ⍳4)
0 1 2 3 ∘.r mat2
但它不起作用,只返回基数组 4 次。我希望它使用左边的术语作为单独应用于右边参数的左边参数。
然而,当我在右边给出多个参数时,它似乎做了我想要的 - 这里它对 2x2 和 3x3 矩阵进行了 0 度和 90 度旋转:
mat2 ← (2 2 ⍴ ⍳4)
mat3 ← (3 3 ⍴ ⍳9)
⍝ This does what I was expecting
0 1 ∘.r mat2 mat3
┌───┬─────┐
│1 2│1 2 3│
│3 4│4 5 6│
│ │7 8 9│
├───┼─────┤
│3 1│7 4 1│
│4 2│8 5 2│
│ │9 6 3│
└───┴─────┘
⍝ This just gives me back the same array twice
0 1 ∘.r mat2
1 2
3 4
1 2
3 4
我对 APL 很陌生,所以我不确定我是不是弄错了外部产品或电源操作符的使用。将形状运算符应用于上述输出也向我展示了一些与我预期不同的东西:
⍴ 0 1 ∘.r mat2 mat3
2 2
⍴ 0 1 ∘.r mat2
2 2 2
所以两个输入数组的情况似乎给了我一个 2x2 数组,其中每个元素都是一个旋转数组,这正是我所期望的。但是一个输入数组的情况是给我一个 2x2x2(如果我使用所有 4 个旋转则为 4x2x2)的数字数组。我不确定是什么导致这里的结构有 1 个与更多正确参数的差异。我对这些结构中的哪一个最终会很困扰,但我不知道差异来自哪里。
你需要的是
0 1 2 3 ∘.r ⊂mat2
或
0 1 2 3 r¨ ⊂mat2
0 1 2 3 ∘.r mat2
正在做什么可以用这个片段来检查:
0 1 2 3 ∘.{⎕←'⍺:'⍺'⍵:'⍵⋄⍺⍵} mat2
⍺: 0 ⍵: 1
⍺: 0 ⍵: 2
⍺: 0 ⍵: 3
⍺: 0 ⍵: 4
⍺: 1 ⍵: 1
⍺: 1 ⍵: 2
⍺: 1 ⍵: 3
⍺: 1 ⍵: 4
⍺: 2 ⍵: 1
⍺: 2 ⍵: 2
⍺: 2 ⍵: 3
⍺: 2 ⍵: 4
⍺: 3 ⍵: 1
⍺: 3 ⍵: 2
⍺: 3 ⍵: 3
⍺: 3 ⍵: 4
发生的情况是 0 1 2 3
中的每个元素都与 mat2
中的每个元素一起压缩。旋转单个数字不会改变其方向,因此您将获得同一矩阵的多个副本。
了解此行为的一个很好的资源是 APL Wiki Outer Product page.
您需要将每个 0 1 2 3
与整个 mat2
压缩在一起,即您需要用 ⊂
将其括起来,以便将其视为单个对象。然后你会得到你需要的旋转。
我正在尝试编写一些 APL 代码,这些代码将采用矩阵并返回矩阵及其所有 90 度旋转。
作为一个旋转函数,我有:{(⌽∘⍉)⍣⍺⊢⍵}
,它在右边有一个矩阵,在左边有 CW 旋转数,它本身似乎工作得很好。
为了生成所有 4 个输出数组,我试过像这样使用外积:
r ← {(⌽∘⍉)⍣⍺⊢⍵}
mat2 ← (2 2 ⍴ ⍳4)
0 1 2 3 ∘.r mat2
但它不起作用,只返回基数组 4 次。我希望它使用左边的术语作为单独应用于右边参数的左边参数。
然而,当我在右边给出多个参数时,它似乎做了我想要的 - 这里它对 2x2 和 3x3 矩阵进行了 0 度和 90 度旋转:
mat2 ← (2 2 ⍴ ⍳4)
mat3 ← (3 3 ⍴ ⍳9)
⍝ This does what I was expecting
0 1 ∘.r mat2 mat3
┌───┬─────┐
│1 2│1 2 3│
│3 4│4 5 6│
│ │7 8 9│
├───┼─────┤
│3 1│7 4 1│
│4 2│8 5 2│
│ │9 6 3│
└───┴─────┘
⍝ This just gives me back the same array twice
0 1 ∘.r mat2
1 2
3 4
1 2
3 4
我对 APL 很陌生,所以我不确定我是不是弄错了外部产品或电源操作符的使用。将形状运算符应用于上述输出也向我展示了一些与我预期不同的东西:
⍴ 0 1 ∘.r mat2 mat3
2 2
⍴ 0 1 ∘.r mat2
2 2 2
所以两个输入数组的情况似乎给了我一个 2x2 数组,其中每个元素都是一个旋转数组,这正是我所期望的。但是一个输入数组的情况是给我一个 2x2x2(如果我使用所有 4 个旋转则为 4x2x2)的数字数组。我不确定是什么导致这里的结构有 1 个与更多正确参数的差异。我对这些结构中的哪一个最终会很困扰,但我不知道差异来自哪里。
你需要的是
0 1 2 3 ∘.r ⊂mat2
或
0 1 2 3 r¨ ⊂mat2
0 1 2 3 ∘.r mat2
正在做什么可以用这个片段来检查:
0 1 2 3 ∘.{⎕←'⍺:'⍺'⍵:'⍵⋄⍺⍵} mat2
⍺: 0 ⍵: 1
⍺: 0 ⍵: 2
⍺: 0 ⍵: 3
⍺: 0 ⍵: 4
⍺: 1 ⍵: 1
⍺: 1 ⍵: 2
⍺: 1 ⍵: 3
⍺: 1 ⍵: 4
⍺: 2 ⍵: 1
⍺: 2 ⍵: 2
⍺: 2 ⍵: 3
⍺: 2 ⍵: 4
⍺: 3 ⍵: 1
⍺: 3 ⍵: 2
⍺: 3 ⍵: 3
⍺: 3 ⍵: 4
发生的情况是 0 1 2 3
中的每个元素都与 mat2
中的每个元素一起压缩。旋转单个数字不会改变其方向,因此您将获得同一矩阵的多个副本。
了解此行为的一个很好的资源是 APL Wiki Outer Product page.
您需要将每个 0 1 2 3
与整个 mat2
压缩在一起,即您需要用 ⊂
将其括起来,以便将其视为单个对象。然后你会得到你需要的旋转。