【发布时间】: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 个与更正确的论点。我对最终会采用哪种结构感到很困扰,但我不知道差异来自哪里。
【问题讨论】: