我如何否定 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而是任意值怎么办?
非常感谢!
“正确”的方法是使用 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 爱好者)
- 初始矩阵
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
- 选择 - 我们想要更新除选择之外的所有内容
sel =: <(<1 2),(<1 2)
sel { r
106 107
111 112
- 索引选择影响:
,sel { i.$r
6 7 11 12
- 索引选择省略:
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 元素和先前选择的 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
我正在玩选择。让我们看一下最初的例子:
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而是任意值怎么办? 非常感谢!
“正确”的方法是使用 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 爱好者)
- 初始矩阵
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
- 选择 - 我们想要更新除选择之外的所有内容
sel =: <(<1 2),(<1 2)
sel { r
106 107
111 112
- 索引选择影响:
,sel { i.$r
6 7 11 12
- 索引选择省略:
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 元素和先前选择的 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