Примените функцию к каждой строке матрицы
У меня есть функция, которая вращает вектор v
длиной 9 offset
в группах по 3 человека:
∇ r ← offset rot3 v
r ← , offset ⌽ 3 3 ⍴ v
∇
Похоже на работу
2 rot3 ⍳ 9
3 1 2 6 4 5 9 7 8
И тогда функция, которая вращает матрицу 9x9 m
по горизонтали offset
в группах по 3 человека:
∇ r ← offset rot3h m
r ← ⊃ offset rot3¨ ,/ m
∇
Это тоже похоже на работу:
a ← 2 rot3h 9 9 ⍴ ⍳ 81
a
3 1 2 6 4 5 9 7 8
12 10 11 15 13 14 18 16 17
21 19 20 24 22 23 27 25 26
30 28 29 33 31 32 36 34 35
39 37 38 42 40 41 45 43 44
48 46 47 51 49 50 54 52 53
57 55 56 60 58 59 63 61 62
66 64 65 69 67 68 72 70 71
75 73 74 78 76 77 81 79 80
⍴ a
9 9
Теперь я хочу построить вектор, который содержит данную матрицу, повернутую на 1, 2 и 3 (которая является тождеством, но не имеет значения):
Поэтому я попробовал это (подумав: "Сделайте внешнее произведение двух векторов, первый из которых содержит 1, 2 и 3; второй содержит a"):
a ← 9 9 ⍴ ⍳ 81
1 2 3 ∘.rot3h ⊂a
К сожалению, результатом этого является:
a ← 9 9 ⍴ ⍳ 81
1 2 3 ∘.rot3h ⊂a
2 3 1 5 6 4 8 9 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
11 12 10 14 15 13 17 18 16
20 21 19 23 24 22 26 27 25
29 30 28 32 33 31 35 36 34
38 39 37 41 42 40 44 45 43
47 48 46 50 51 49 53 54 52
56 57 55 59 60 58 62 63 61
65 66 64 68 69 67 71 72 70
74 75 73 77 78 76 80 81 79
Может кто-нибудь объяснить мне, где мои рассуждения пошли вразнос?
2 ответа
Пытаться
1 2 3 rot3h¨⊂a
Включение a приводит к превращению его в скаляр, тогда вы можете последовательно применять 1, 2 и 3 rot3h путем скалярного расширения. (1 + 2 3 4 расширяет 1 так, что он добавляется ко всем элементам 2 3 4)
Возвращаясь к исходному выражению, при использовании внешнего продукта интуитивное ожидание будет состоять в том, что вы получите матрицу обратно. Поскольку правильный аргумент является скалярным, а ожидаемый результат - вектором матриц, использование каждой из них может быть более естественным.
Сказав это, ваше оригинальное выражение сработало правильно и вернуло тот же результат в Dyalog APL.
Хороший пример - я бы сообщил об этой ошибке разработчикам GNU APL.
Я получаю это с SVN версии 4525 GNU APL 1.1:
∇ r ← offset rot3 v
[1] r ← , offset ⌽ 3 3 ⍴ v
[2] ∇
∇ r ← offset rot3h m
[1] r ← ⊃ offset rot3¨ ,/ m
[2] ∇
a ← 9 9 ⍴ ⍳ 81
1 2 3 ∘.rot3h ⊂a
2 3 1 5 6 4 8 9 7 3 1 2 6 4 5 9 7 8
11 12 10 14 15 13 17 18 16 12 10 11 15 13 14 18 16 17
20 21 19 23 24 22 26 27 25 21 19 20 24 22 23 27 25 26
29 30 28 32 33 31 35 36 34 30 28 29 33 31 32 36 34 35
38 39 37 41 42 40 44 45 43 39 37 38 42 40 41 45 43 44
47 48 46 50 51 49 53 54 52 48 46 47 51 49 50 54 52 53
56 57 55 59 60 58 62 63 61 57 55 56 60 58 59 63 61 62
65 66 64 68 69 67 71 72 70 66 64 65 69 67 68 72 70 71
74 75 73 77 78 76 80 81 79 75 73 74 78 76 77 81 79 80
1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18
19 20 21 22 23 24 25 26 27
28 29 30 31 32 33 34 35 36
37 38 39 40 41 42 43 44 45
46 47 48 49 50 51 52 53 54
55 56 57 58 59 60 61 62 63
64 65 66 67 68 69 70 71 72
73 74 75 76 77 78 79 80 81