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

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 ? Как я узнаю это сам?

apl
2
Siddharth Bhat 7 Мар 2020 в 09:39

2 ответа

Лучший ответ

Со страницы страницы справки Dyalog на странице «Внутренний продукт» :

R←X f.g Y

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

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

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

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

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

До сих пор мы рассмотрели более половины предложения Дока. Тогда что означает «векторы вдоль последней оси 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, то есть правда. Попробуйте это онлайн!

2
Bubbler 9 Мар 2020 в 00:42

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

Определение Дьялога

документация Dyalog приводит к модели {{X0 }}. Попробуйте!

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

документация IBM приводит к модели Dyalog APL (!) {{X0 }}. Попробуйте!

2
Adám 9 Мар 2020 в 11:08