返回 APL 中旋转 90、180 和 270 度的矩阵以及外积

Sim*_*ley 5 arrays apl

我正在尝试编写一些 APL 代码,该代码将获取一个矩阵并返回该矩阵及其所有 90 度旋转。

\n

作为旋转函数,我有: {(\xe2\x8c\xbd\xe2\x88\x98\xe2\x8d\x89)\xe2\x8d\xa3\xe2\x8d\xba\xe2\x8a\xa2\xe2\x8d\xb5},它在右侧采用矩阵,在左侧采用 CW 旋转数,并且它本身似乎工作得很好。

\n

为了生成所有 4 个输出数组,我尝试使用外部积,如下所示:

\n
r \xe2\x86\x90 {(\xe2\x8c\xbd\xe2\x88\x98\xe2\x8d\x89)\xe2\x8d\xa3\xe2\x8d\xba\xe2\x8a\xa2\xe2\x8d\xb5}\nmat2 \xe2\x86\x90 (2 2 \xe2\x8d\xb4 \xe2\x8d\xb34)\n\n0 1 2 3  \xe2\x88\x98.r mat2\n
Run Code Online (Sandbox Code Playgroud)\n

但它不起作用,只返回基本数组 4 次。我希望它使用左侧术语作为左侧参数单独应用于右侧参数。

\n

然而,当我在右侧给出多个参数时,它似乎做了我想要的事情 - 这里它对 2x2 和 3x3 矩阵进行 0 度和 90 度旋转:

\n
mat2 \xe2\x86\x90 (2 2 \xe2\x8d\xb4 \xe2\x8d\xb34)\nmat3 \xe2\x86\x90 (3 3 \xe2\x8d\xb4 \xe2\x8d\xb39)\n\n\xe2\x8d\x9d This does what I was expecting\n       0 1 \xe2\x88\x98.r mat2 mat3\n\n\xe2\x94\x8c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x821 2\xe2\x94\x821 2 3\xe2\x94\x82\n\xe2\x94\x823 4\xe2\x94\x824 5 6\xe2\x94\x82\n\xe2\x94\x82   \xe2\x94\x827 8 9\xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xbc\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xa4\n\xe2\x94\x823 1\xe2\x94\x827 4 1\xe2\x94\x82\n\xe2\x94\x824 2\xe2\x94\x828 5 2\xe2\x94\x82\n\xe2\x94\x82   \xe2\x94\x829 6 3\xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\xb4\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n\n\xe2\x8d\x9d This just gives me back the same array twice\n      0 1 \xe2\x88\x98.r mat2 \n1 2\n3 4\n   \n1 2\n3 4\n
Run Code Online (Sandbox Code Playgroud)\n

我对 APL 很陌生,所以我不确定我是否得到了外部产品或电源操作员的使用错误。将形状运算符应用于上述输出也向我展示了与我预期不同的东西:

\n
    \xe2\x8d\xb4 0 1 \xe2\x88\x98.r mat2 mat3\n2 2\n\n    \xe2\x8d\xb4 0 1 \xe2\x88\x98.r mat2 \n2 2 2\n\n
Run Code Online (Sandbox Code Playgroud)\n

因此,两个输入数组的情况似乎给了我一个 2x2 数组,其中每个元素都是一个旋转数组,这正是我所期望的。但是,只有一个输入数组的情况给了我一个 2x2x2(如果我使用全部 4 次旋转,则为 4x2x2)的数字数组。我不确定是什么导致了这里 1 个与更多正确参数的结构差异。我太在意我最终会得到这些结构中的哪一个,但我不知道差异从何而来。

\n

Raz*_*ime 6

你需要的是

\n
0 1 2 3  \xe2\x88\x98.r \xe2\x8a\x82mat2\n
Run Code Online (Sandbox Code Playgroud)\n

或者

\n
0 1 2 3  r\xc2\xa8 \xe2\x8a\x82mat2\n
Run Code Online (Sandbox Code Playgroud)\n

什么0 1 2 3 \xe2\x88\x98.r mat2可以使用以下代码片段检查正在执行的操作

\n
      0 1 2 3  \xe2\x88\x98.{\xe2\x8e\x95\xe2\x86\x90\'\xe2\x8d\xba:\'\xe2\x8d\xba\'\xe2\x8d\xb5:\'\xe2\x8d\xb5\xe2\x8b\x84\xe2\x8d\xba\xe2\x8d\xb5} mat2                                                                                                                                                      \n \xe2\x8d\xba:  0  \xe2\x8d\xb5:  1\n \xe2\x8d\xba:  0  \xe2\x8d\xb5:  2\n \xe2\x8d\xba:  0  \xe2\x8d\xb5:  3\n \xe2\x8d\xba:  0  \xe2\x8d\xb5:  4\n \xe2\x8d\xba:  1  \xe2\x8d\xb5:  1\n \xe2\x8d\xba:  1  \xe2\x8d\xb5:  2\n \xe2\x8d\xba:  1  \xe2\x8d\xb5:  3\n \xe2\x8d\xba:  1  \xe2\x8d\xb5:  4\n \xe2\x8d\xba:  2  \xe2\x8d\xb5:  1\n \xe2\x8d\xba:  2  \xe2\x8d\xb5:  2\n \xe2\x8d\xba:  2  \xe2\x8d\xb5:  3\n \xe2\x8d\xba:  2  \xe2\x8d\xb5:  4\n \xe2\x8d\xba:  3  \xe2\x8d\xb5:  1\n \xe2\x8d\xba:  3  \xe2\x8d\xb5:  2\n \xe2\x8d\xba:  3  \xe2\x8d\xb5:  3\n \xe2\x8d\xba:  3  \xe2\x8d\xb5:  4\n
Run Code Online (Sandbox Code Playgroud)\n

正在发生的事情是,每个都0 1 2 3与每个元素一起压缩mat2。旋转单个数字不会改变其方向,因此您将获得同一矩阵的多个副本。

\n

APL Wiki 是理解这种行为的一个很好的资源

\n

0 1 2 3你需要的是将每个 ie与整个ie 一起压缩,mat2你需要将其括起来\xe2\x8a\x82ie 一起压缩,以便将其视为单个对象。然后你就会得到你需要的轮换。

\n