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

问题描述

(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} }、(1 2)(1,2),然后再次(1,2)。 这样看可能更容易:

(1,2)

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

因此,如果您想给出这样的索引,您可能需要将 each 运算符 (1 2)3⌷¨ 一起使用:

如果你真的很想要那个,那么你可以使用

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

正如其他答案所示,有更多的索引替代方法。我还可以推荐以下有关索引的网络研讨会:https://dyalog.tv/Webinar/?v=AgYDvSF2FfU .

花点时间查看视频中的替代方案,APL 与 Python 不同:在 APL 中,通常有不止一种明显的方法可以做到:)