#j
Вопрос:
Давайте предположим, что у нас есть вектор и матрица, как показано ниже:
r =: 100 5 5 $ i.25
r
100 101 102 103 104
105 106 107 108 109
110 111 112 113 114
115 116 117 118 119
120 121 122 123 124
v =: 100 5 $ i.5
v
100 101 102 103 104
Теперь я хотел бы иметь возможность обмениваться фрагментами, как указано селекторами.
Я знаю, как я могу обменять вещи:
(<0 _1) amp;C. v
104 101 102 103 100
здесь я поменял местами элемент с индексом=0 и индексом=-1.
В случае матрицы строки (элементы) изменяются:
(<0 _1) amp;C. r
120 121 122 123 124
105 106 107 108 109
110 111 112 113 114
115 116 117 118 119
100 101 102 103 104
Но как насчет того, если я хочу указать два произвольных варианта выбора? Пример того, что мне нужно:
sel1 =: (< (<0 1))
sel1 { v
100 101
sel2 =: (< (<2 3))
sel2 { v
102 103
sel1 sel2 INTERCHANGE v
102 103 100 101 104
И то же самое для матрицы:
sel1 =: (< (<0 1),(<0 1))
sel1 { r
100 101
105 106
sel2 =: (< (<3 4),(<1 2))
sel2 { r
116 117
121 122
sel1 sel2 INTERCHANGE r
116 117 102 103 104
121 122 107 108 109
110 111 112 113 114
115 100 101 118 119
120 105 106 123 124
Поэтому мой вопрос будет заключаться в том, как определить обмен, который использует два выбора?
Ответ №1:
Я думаю, что сначала я бы создал два варианта, а затем использовал бы Amend, чтобы поменять их местами. Возможно, это не самый элегантный или обобщаемый вариант, но если вы знаете, какие параметры вы хотите изменить, и они имеют одинаковую форму, это действительно работает.
r
100 101 102 103 104
105 106 107 108 109
110 111 112 113 114
115 116 117 118 119
120 121 122 123 124
[rep=:((<3 4;1 2),(<0 1;0 1)) { r NB. rep is the selected replacement values
116 117
121 122
100 101
105 106
((<0 1;0 1),(<3 4;1 2)){ r NB. values that will be replaced (just a check that they are the same shape)
100 101
105 106
116 117
121 122
rep ((<0 1;0 1),(<3 4;1 2))} r NB. Select verb ({) changed to Amend adverb (})
116 117 102 103 104
121 122 107 108 109
110 111 112 113 114
115 100 101 118 119
120 105 106 123 124
Комментарии:
1. Молчаливо:
INTERCHANGE=:(|.@{)`[`]}
,(sel1, sel2) INTERCHANGE r