APL:矩阵操纵技巧?

Chr*_*ang 5 matrix apl

我正在尝试找到一种方法(惯用的或其他方式)来转换看起来像的矩阵

0 1
0 1
0 1
Run Code Online (Sandbox Code Playgroud)

分成3个单独的矩阵

0 1
0 0
0 0

0 0
0 1
0 0

0 0
0 0
0 1
Run Code Online (Sandbox Code Playgroud)

这样当我将它们全部组合在一起时,我就得到了原始的。这些“子矩阵”中的每一个都必须仅具有 1 个非零元素,并且必须具有与原始矩阵相同的形状。

Pau*_*our 3

一种解决方案:

\n\n

任意布尔矩阵:

\n\n
      m\xe2\x86\x904 3\xe2\x8d\xb4?12\xe2\x8d\xb42\n      m\n0 0 1\n0 0 0\n1 1 0\n0 1 0\n
Run Code Online (Sandbox Code Playgroud)\n\n

注意它的形状:

\n\n
    d\xe2\x86\x90\xe2\x8d\xb4m\n    d\n4 3\n
Run Code Online (Sandbox Code Playgroud)\n\n

将矩阵分解为向量:

\n\n
      v\xe2\x86\x90,m\n      v\n0 0 1 0 0 0 1 1 0 0 1 0\n
Run Code Online (Sandbox Code Playgroud)\n\n

生成索引:

\n\n
          i \xe2\x86\x90\xe2\x8d\xb3\xe2\x8d\xb4v\n          i\n    0 1 2 3 4 5 6 7 8 9 10 11\n
Run Code Online (Sandbox Code Playgroud)\n\n

为原始矩阵中的每个 1 构造一个矩阵:

\n\n
      a\xe2\x86\x90d\xe2\x88\x98\xe2\x8d\xb4\xc2\xa8\xe2\x86\x93(v/i)\xe2\x88\x98.=i\n      a\n 0 0 1  0 0 0  0 0 0  0 0 0 \n 0 0 0  0 0 0  0 0 0  0 0 0 \n 0 0 0  1 0 0  0 1 0  0 0 0 \n 0 0 0  0 0 0  0 0 0  0 1 0 \n
Run Code Online (Sandbox Code Playgroud)\n\n

验证结果:

\n\n
   \xe2\x86\x91\xe2\x88\xa8/a\n0 0 1\n0 0 0\n1 1 0\n0 1 0\n
Run Code Online (Sandbox Code Playgroud)\n\n

也可能有一种很好的方法可以使用散点索引来做到这一点,首先生成一个 3 维矩阵,然后指定 1 的位置。

\n\n

是的,使用上面的 v 和 d:

\n\n
       n\xe2\x86\x90+/v\n       b\xe2\x86\x90(n,d)\xe2\x8d\xb40\n       b[\xe2\x86\x93\xe2\x8d\x89(\xe2\x8d\xb3n)\xe2\x8d\xaad\xe2\x8a\xa4v/\xe2\x8d\xb3\xe2\x8d\xb4v]\xe2\x86\x901\n       b\n0 0 1\n0 0 0\n0 0 0\n0 0 0\n\n0 0 0\n0 0 0\n1 0 0\n0 0 0\n\n0 0 0\n0 0 0\n0 1 0\n0 0 0\n\n0 0 0\n0 0 0\n0 0 0\n0 1 0\n      \xe2\x88\xa8\xe2\x8c\xbfb\n0 0 1\n0 0 0\n1 1 0\n0 1 0\n
Run Code Online (Sandbox Code Playgroud)\n