APL - Почему это производит таблицу умножения? - PullRequest
3 голосов
/ 26 апреля 2020

Я (случайно) написал следующую функцию в APL:

{⍳⍵ ⍵}

Я был удивлен, что когда я вызываю эту функцию (проверьте ее) , она создает действительную таблицу умножения:

      {⍳⍵ ⍵} 3
┌───┬───┬───┐
│1 1│1 2│1 3│
├───┼───┼───┤
│2 1│2 2│2 3│
├───┼───┼───┤
│3 1│3 2│3 3│
└───┴───┴───┘

Используя мои текущие знания в APL, я не могу точно понять, как это приводит к созданию правильной таблицы умножения, так как я не правильно написал здесь внутренний продукт.

1 Ответ

3 голосов
/ 26 апреля 2020

Monadi c - это Генератор индекса . которая принимает форму массива s в качестве единственного аргумента. Он генерирует массив формы s, где каждый элемент является индексом для этого элемента:

      ⍳5  ⍝ vector
1 2 3 4 5
      ⍳2 3  ⍝ matrix
┌───┬───┬───┐
│1 1│1 2│1 3│
├───┼───┼───┤
│2 1│2 2│2 3│
└───┴───┴───┘
      ⍳2 3 4  ⍝ block of 2 layers, each with 3 rows and 4 columns
┌─────┬─────┬─────┬─────┐
│1 1 1│1 1 2│1 1 3│1 1 4│
├─────┼─────┼─────┼─────┤
│1 2 1│1 2 2│1 2 3│1 2 4│
├─────┼─────┼─────┼─────┤
│1 3 1│1 3 2│1 3 3│1 3 4│
└─────┴─────┴─────┴─────┘
┌─────┬─────┬─────┬─────┐
│2 1 1│2 1 2│2 1 3│2 1 4│
├─────┼─────┼─────┼─────┤
│2 2 1│2 2 2│2 2 3│2 2 4│
├─────┼─────┼─────┼─────┤
│2 3 1│2 3 2│2 3 3│2 3 4│
└─────┴─────┴─────┴─────┘

Хотя вы называете результат таблицей умножения, умножение не происходит, только сопоставление индексов вдоль каждого ось. Однако вы правы, что это похоже на внешний (не внутренний ) продукт с функцией конкатенации (∘.,):

      (⍳2)∘.,(⍳3)
┌───┬───┬───┐
│1 1│1 2│1 3│
├───┼───┼───┤
│2 1│2 2│2 3│
└───┴───┴───┘
...