Семантика оператора APL точка? - PullRequest
2 голосов
/ 07 марта 2020

Точка . может использоваться для реализации различных типов продуктов. Например,

1 2 3 +.× 4 5 6

Я предположил, что семантика a f.g b была: вычислите g(a[i], b[i]), затем уменьшите, используя f. То есть,

dot f g = f/a g¨ b ⍝ map g between a and b, and then reduce using f

Чтобы убедиться в этом, я написал:

    ]display  a ← ⍳ 4 ⋄ b ← 4 +⍳ 4 ⋄  I ← { ((⊂ ⍺), (⊂ ⍵))} ⋄ a I.I b
┌─────────────────────────────────────┐
│ ┌→────────────────────────────────┐ │
│ │ ┌→──┐ ┌→──────────────────────┐ │ │
│ │ │1 5│ │ ┌→──┐ ┌→────────────┐ │ │ │
│ │ └~──┘ │ │2 6│ │ ┌→──┐ ┌→──┐ │ │ │ │
│ │       │ └~──┘ │ │3 7│ │4 8│ │ │ │ │
│ │       │       │ └~──┘ └~──┘ │ │ │ │
│ │       │       └∊────────────┘ │ │ │
│ │       └∊──────────────────────┘ │ │
│ └∊────────────────────────────────┘ │
└∊────────────────────────────────────┘

Мы можем ясно видеть сгиб справа элементов, так как он сначала отображает I, создавая (1 5) (2 6) (3 7) (4 8), а затем складывается, используя I, создавая вложенную структуру, поэтому мое определение, кажется, работает!


Однако это не работает для матриц:

      ]display a ← 2 2 ⍴ ⍳ 4 ⋄ b ← 4 + 2 2 ⍴ ⍳ 4 ⋄   I ← { ((⊂ ⍺), (⊂ ⍵))} ⋄ a I.I b
┌→────────────────────────────────┐
↓ ┌→────────────┐ ┌→────────────┐ │
│ │ ┌→──┐ ┌→──┐ │ │ ┌→──┐ ┌→──┐ │ │
│ │ │1 5│ │2 7│ │ │ │1 6│ │2 8│ │ │
│ │ └~──┘ └~──┘ │ │ └~──┘ └~──┘ │ │
│ └∊────────────┘ └∊────────────┘ │
│ ┌→────────────┐ ┌→────────────┐ │
│ │ ┌→──┐ ┌→──┐ │ │ ┌→──┐ ┌→──┐ │ │
│ │ │3 5│ │4 7│ │ │ │3 6│ │4 8│ │ │
│ │ └~──┘ └~──┘ │ │ └~──┘ └~──┘ │ │
│ └∊────────────┘ └∊────────────┘ │
└∊────────────────────────────────┘

Интересно! так что в этом случае кажется, что он фактически вычисляет какой-то внешний продукт между его элементами, а не «складку»? Мое гипотетическое определение оператора . не выполняет ту же операцию:

]display a ← 2 2 ⍴ ⍳ 4 ⋄ b ← 4 + 2 2 ⍴ ⍳ 4 ⋄   I ← { ((⊂ ⍺), (⊂ ⍵))} ⋄ I/a I¨b
┌→────────────────────────────────┐
│ ┌→────────────┐ ┌→────────────┐ │
│ │ ┌→──┐ ┌→──┐ │ │ ┌→──┐ ┌→──┐ │ │
│ │ │1 5│ │2 6│ │ │ │3 7│ │4 8│ │ │
│ │ └~──┘ └~──┘ │ │ └~──┘ └~──┘ │ │
│ └∊────────────┘ └∊────────────┘ │
└∊────────────────────────────────┘

Итак, Какова фактическая семантика . (точка) в APL ? Как я узнаю это сам?

Ответы [ 2 ]

2 голосов
/ 09 марта 2020

Определение внутреннего продукта (f.g) на самом деле немного отличается между диалектами. Далее я не буду принимать во внимание одноэлементные аргументы, поскольку они рассматриваются как скаляры.

Определение Dyalog

Документация Dyalog приводит к модели {⍺(⍺⍺⌿⍵⍵¨⍤¯1)⍤1 999⊢⍵}. Попробуйте!

Определение IBM

Документация IBM приводит к модели Dyalog APL (!) {⍺⍺/¨(⊂⍤1⊢⍺)∘.⍵⍵⍉⊂⍤1⍉⍵}. Попробуй!

2 голосов
/ 09 марта 2020

Со страницы справки Dyalog на "Внутреннем продукте" :

R←X f.g Y

Результат производной функции имеет форму (¯1↓⍴X),1↓⍴Y; каждый элемент равен f/x g¨y, где x и y - векторы, взятые из всех комбинаций векторов вдоль последней оси X и первой оси Y.

In в случае vector f.g vector, это хорошо понимать как f/ vector g¨ vector, как вы уже заметили. Однако для матриц и многомерных массивов это становится более сложным.

Для матриц наиболее простым (и наиболее цитируемым) использованием является «матричный продукт» +.×. Математически, для матрицы X размером n × n и матрицы Y размером n × p, X +.× Y определяется как матрица размером m × p, элемент которой в [i;j] является векторным точечным произведением (сумма поэлементных значений). продукты) из i-й строки X и j-го столбца Y. Для иллюстрации см. страницу Википедии .

В этом случае массив X ( матрица m-by-n) имеет форму () m n, а Y имеет форму n p. Результат имеет форму m p, которая равна (¯1↓m n),1↓n p.

Если мы обобщим это определение на произвольные функции f и g, (для матриц X и Y) мы можем определить X f.g Y быть другой матрицей, элементами которой являются «уменьшение на f» «поэлементных g» каждой строки X и каждого столбца Y. Это именно то, о чем говорит do c, когда упоминает f/x g¨ y , Кроме того, X имеет m строк, а Y имеет p столбцов, поэтому при расчете всех комбинаций каждой строки X и каждого столбца Y будет дано точно m×p значений.

Пока что мы Вы рассмотрели более половины предложения do c. Тогда что означает «векторы вдоль последней оси X»? Для матрицы X формы m n последняя ось имеет длину n, поэтому матрицу X можно рассматривать как m векторов длины n. Аналогично, «векторы вдоль первой оси Y» означают просмотр формы n p матрицы Y как p векторов длины n. Тогда два вектора длины - n (один из X, а другой из Y) становятся аргументами , что означает, что длины должны совпадать.

Мы также можем обобщить эту концепцию на более высокие размерные массивы. Если у нас есть a×b×c массив X, он имеет a×b векторов длины c (последняя ось). Если у нас есть другой c×d×e массив Y, он имеет d×e векторов длины c (первая ось). Тогда вычисление по всем комбинациям векторов даст a×b×d×e элементов, что, естественно, даст массив результатов формы a b d e.

Суммируя все это, X f.g Y эквивалентно извлечению векторов последней оси X и векторы первой оси Y и вычисление внешнего произведения из f/ x g¨ y по векторам:

a ← 2 3 3⍴⍳4
b ← 3 3 4⍴⍳5
f ← {⍺+⊂⍵}
g ← {⍺⍵}
⎕←(a f.g b) ≡ (↓[≢⍴a]a) ∘.{⊃ f/ ⍺ g¨ ⍵} (↓[1]b)

Эта программа выводит 1, то есть значение true. Попробуйте онлайн!

...