我如何否定 J lang 中的选择器?

How do I negate a selector in J lang?

我正在玩选择。让我们看一下最初的例子:

rarg=. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
   _1 (<(<0 1),(<0 1)) } ( 4 4 $ rarg)
_1 _1  2  3
_1 _1  6  7
 8  9 10 11
12 13 14 15

这里我要覆盖block {rows=0,1;列=0,1}。我可以使用块来代替 -1 :

   (2 2 $ _1 _2 _3 _4) (<(<0 1),(<0 1)) } ( 4 4 $ rarg)
_1 _2  2  3
_3 _4  6  7
 8  9 10 11
12 13 14 15

如果我在选择器中否定行和列的选择,我最终会得到预期的结果:

   _1 (<(<<0 1),(<<0 1)) } ( 4 4 $ rarg)
 0  1  2  3
 4  5  6  7
 8  9 _1 _1
12 13 _1 _1

到目前为止一切顺利。但是假设我想“否定”选择器 (<(<0 1),(<0 1)) 并且有这样的东西:

   _1 NEGATED_SEL } ( 4 4 $ rarg)
0   1  _1  _1
4   5  _1  _1
_1 _1  _1  _1
_1 _1  _1  _1
  1. 有没有办法使用上面的选择器来实现?
  2. 如果是,如果我想指定的不是-1而是任意值怎么办? 非常感谢!

“正确”的方法是使用 exclude (<):

(<< 0 1) { i. 4 4
0 1 2 3
4 5 6 7
(<<< 0 1) { i. 4 4
 8  9 10 11
12 13 14 15

但是,正如@Dan_Bron 提到的,} 不允许这样做,因为选区不是矩形的。

如果您先解开然后重新解开您的输入,您仍然可以使用 exclude

sel =: <(<<0 1),(<<0 1)
r =: i. 4 4

sel { r
 10 11
 14 15

_1 sel } r
  0  1  2  3
  4  5  6  7
  8  9 _1 _1
 12 13 _1 _1

new =: -i. 12

($r) $ new (<<<,sel { r) } ,r
   0  _1 _2 _3
  _4  _5 _6 _7
  _8  _9 10 11
 _10 _11 14 15

对于一般输入 m,您可以通过 sel { i. $m:

将选择转换为索引
($m) $ new (<<<,sel { i.$m) } , m

标准方法是使用 Composite Item (m}),正如 Dan Bron 所说:

    aNEGATED_SEL1=. 1 : 'y=. (*./~ 1 < i. # y)} y ,: m'  NB. adverb, 1st variant
    aNEGATED_SEL2=. 1 : 'y=. (*:/~ 1 < i. # y)} m ,: y'  NB. adverb, 2nd variant
   _1 aNEGATED_SEL1 ( 4 4 $ rarg)
 0  1  2  3
 4  5  6  7
 8  9 _1 _1
12 13 _1 _1
   _1 aNEGATED_SEL2 ( 4 4 $ rarg)
 0  1  2  3
 4  5  6  7
 8  9 _1 _1
12 13 _1 _1

如果覆盖块必须不同,则可以将其作为参数提供给连词:

   cNEGATED_SEL=. 2 : 'y=. (*./~ n <: i. # y)} y ,: m'
   _1 cNEGATED_SEL 2 ( 4 4 $ rarg)
 0  1  2  3
 4  5  6  7
 8  9 _1 _1
12 13 _1 _1
   _1 cNEGATED_SEL 3 ( 6 6 $ rarg)
 0  1  2  3  4  5
 6  7  8  9 10 11
12 13 14 15  0  1
 2  3  4 _1 _1 _1
 8  9 10 _1 _1 _1
14 15  0 _1 _1 _1

上面使用的形式(名词修饰语)强制封装了一个副词(})。最近的 J 引擎修改(自 J903 beta-r 起)可能允许您请求的形式(名词修饰符 })。

感谢大家提供的重要提示和答案。带有中间步骤的最终解决方案(适用于像我这样的初学者 J 爱好者)

  1. 初始矩阵
   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
  1. 选择 - 我们想要更新除选择之外的所有内容
   sel =: <(<1 2),(<1 2)
   sel { r
106 107
111 112
  1. 索引选择影响:
   ,sel { i.$r
6 7 11 12
  1. 索引选择省略:
   selIxs =: (< (<< (,sel { i.$r)) ) { ,i.$r
0 1 2 3 4 5 8 9 10 13 14 15 16 17 18 19 20 21 22 23 24
  1. 最终更新(我们正在展平要更新的矩阵,使用向量更新(这里使用 -1 元素和先前选择的 ixs)使用 } 并最终强制执行初始矩阵的形状)
   ($r) $ _1 selIxs } ,r
_1  _1  _1 _1 _1
_1 106 107 _1 _1
_1 111 112 _1 _1
_1  _1  _1 _1 _1
_1  _1  _1 _1 _1