【问题标题】:Returning a matrix rotated by 90, 180, and 270 degrees in APL with outer product使用外积返回 APL 中旋转 90、180 和 270 度的矩阵
【发布时间】:2022-01-17 13:40:20
【问题描述】:

我正在尝试编写一些 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 个与更正确的论点。我对最终会采用哪种结构感到很困扰,但我不知道差异来自哪里。

【问题讨论】:

    标签: arrays apl


    【解决方案1】:

    你需要的是

    0 1 2 3  ∘.r ⊂mat2
    

    0 1 2 3  r¨ ⊂mat2
    

    0 1 2 3 ∘.r mat2 正在做什么可以用这个 sn-p 检查:

          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 一起压缩,即您需要用 将其括起来,以便将其视为单个对象。然后你会得到你需要的旋转。

    【讨论】:

      最近更新 更多