Почему +.x в APL работает как для матриц, так и для векторов?

Я понимаю, что по сути это умножение уменьшается путем сложения, но что в этом волшебства, заставляя его работать как для векторов, так и для матриц.

Для вектора мы можем сделать что-то вроде +/ A x B вместо этого с тем же результатом. Но это не будет работать для матриц, как x просто сделал бы 2 2 матрица, и уменьшение его приведет к 2 вектор.

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

Так как же это работает тогда?

2 ответа

Решение

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

Таким образом, левый аргумент матрицы с формой 5 2 3 2 будет работать с правым аргументом матрицы с формой 2 3 9. 3 2 совпадает с 2 3. Форма результата будет такой же, как у левого аргумента без последнего элемента. скованный с формой права аргументированный без первого элемента, в данном случае 5 2 3 3 9.

В случае векторных аргументов будет использоваться внутреннее одиночное измерение.

  (1 3 p 1 2 3) +.x 3 1 p 1 2 3         (matrices match)

14

  1 2 3 +.x 3 1 p 1 2 3                

14

  (1 3 p 1 2 3) +.x 1 2 3

14

  1 2 3 +.x 1 2 3

14

Внутренний продукт может быть определен как:

A f.g B   ←→   f/¨ (⊂[¯1+⍴⍴A]A) ∘.g ⊂[0]B

То есть: вырезать A на кусочки вдоль его последней оси, сделайте то же самое с B вдоль его первой оси, затем объедините каждый срез из A с каждым кусочком из B с помощью gи, наконец, выполнить сокращение, используя f,

Если A а также B матрицы, срезы будут строками A и столбцы B:

┌───┐     ┌───┐
│0 1│     │4 5│
│   │ +.× │   │
│2 3│     │6 7│
└───┘     └───┘

     ┌───┐     ┌─┬─┐
     │0 1│     │4│5│
+/¨  ├───┤ ∘.× │ │ │
     │2 3│     │6│7│
     └───┘     └─┴─┘

     ┌─────────┬─────────┐
     │0 1 × 4 6│0 1 × 5 7│
+/¨  ├─────────┼─────────┤
     │2 3 × 4 6│2 3 × 5 7│
     └─────────┴─────────┘

┌────────────┬────────────┐
│+/ 0 1 × 4 6│+/ 0 1 × 5 7│
├────────────┼────────────┤
│+/ 2 3 × 4 6│+/ 2 3 × 5 7│
└────────────┴────────────┘

┌─────┐
│ 6  7│
│     │
│26 31│
└─────┘

Если A а также B векторы, то срезы будут A а также B сами, и вы получите

A +.× B   ←→   +/ A×B        ⍝ if A and B are vectors

В любом случае, чтобы внутренний продукт работал, Aпоследняя ось должна соответствовать длине BПервая ось

Другие вопросы по тегам