Как использовать произвольный селектор в interchange в J lang?

#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