如何从 APL 隐式函数中的矩阵中提取多个元素?

How can I extract multiple elements from a matrix in an APL tacit function?

(Dyalog) APL 学习者问题

如果我有一个矩阵 Y:

          Y
4 9 2
3 5 7
8 1 6

我可以这样得到它的两个成员:

      Y[(1 1) (2 2)]
4 5

我可以使用 dfn 语法使用相同的技术:

      {⍵[(1 1) (2 2)]}Y
4 5

但是,我不知道如何在默认函数中执行等效操作。特别是括号索引似乎在默认函数中不起作用,而且我找不到将小队索引与索引列表一起使用的方法。

有没有办法做到这一点,或者这是默认功能的限制?

请注意,在我的真实示例中生成了索引列表,因此我不能简单地执行 (((1 1)⌷⊢),(2 2)⌷⊢)Y 或类似的操作。

(1 1)(2 2)⌷¨⊂Y

有效,也

(1 1)(2 2)⊃⍤0 99⊢Y

人们可能会尝试的第一件事是

      Y ← 3 3⍴⍳9
      Y
1 2 3
4 5 6
7 8 9

      Y[(1 1)(2 2)]
1 5

      1 1⌷Y
1

      (1 1)(2 2)⌷Y
2 2
2 2

但我们看到 (1 1)(2 2)⌷Y 不起作用。发生的事情是 查看其左侧的向量并构建索引的所有组合,这只是构建一个 2 x 2 的 2 矩阵,因为 (1 1)(2 2) 被解释为索引 (1 2)(1, 2)(1, 2),然后再次 (1, 2)。 这样看可能更容易:

      (1 2)3⌷Y
3 6

(1 2)3⌷ 意思是“从第一行和第二行,给我第三列的元素”。

因此,如果你想给出这样的索引,你可能需要使用每个运算符 ¨:

      (1 1)(2 2)⌷¨⊂Y
1 5

如果你真的想默认那个,那么你可以使用

I ← ⌷¨∘⊂

正如其他答案所显示的那样,除了索引之外还有更多选择。我还可以推荐以下关于索引的网络研讨会:https://dyalog.tv/Webinar/?v=AgYDvSF2FfU .

花点时间浏览一下视频中的备选方案,APL 不像 Python:在 APL 中,通常有不止一种明显的方法:)