我正在尝试编写一些 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 旋转数,并且它本身似乎工作得很好。
为了生成所有 4 个输出数组,我尝试使用外部积,如下所示:
\nr \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\nRun Code Online (Sandbox Code Playgroud)\n但它不起作用,只返回基本数组 4 次。我希望它使用左侧术语作为左侧参数单独应用于右侧参数。
\n然而,当我在右侧给出多个参数时,它似乎做了我想要的事情 - 这里它对 2x2 和 3x3 矩阵进行 0 度和 90 度旋转:
\nmat2 \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\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n因此,两个输入数组的情况似乎给了我一个 2x2 数组,其中每个元素都是一个旋转数组,这正是我所期望的。但是,只有一个输入数组的情况给了我一个 2x2x2(如果我使用全部 4 次旋转,则为 4x2x2)的数字数组。我不确定是什么导致了这里 1 个与更多正确参数的结构差异。我太在意我最终会得到这些结构中的哪一个,但我不知道差异从何而来。
\n你需要的是
\n0 1 2 3 \xe2\x88\x98.r \xe2\x8a\x82mat2\nRun Code Online (Sandbox Code Playgroud)\n或者
\n0 1 2 3 r\xc2\xa8 \xe2\x8a\x82mat2\nRun Code Online (Sandbox Code Playgroud)\n什么0 1 2 3 \xe2\x88\x98.r mat2可以使用以下代码片段检查正在执行的操作
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\nRun Code Online (Sandbox Code Playgroud)\n正在发生的事情是,每个都0 1 2 3与每个元素一起压缩mat2。旋转单个数字不会改变其方向,因此您将获得同一矩阵的多个副本。
APL Wiki 是理解这种行为的一个很好的资源。
\n0 1 2 3你需要的是将每个 ie与整个ie 一起压缩,mat2你需要将其括起来\xe2\x8a\x82ie 一起压缩,以便将其视为单个对象。然后你就会得到你需要的轮换。