Почему +.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
Первая ось