【问题标题】:How do I negate a selector in J lang?如何否定 J lang 中的选择器?
【发布时间】:2021-10-18 19:39:31
【问题描述】:

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

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

这里我想覆盖块 {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

到目前为止一切顺利。但是让我们假设我想“否定”选择器 ( 并有这样的事情:

   _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,而是任意值怎么办? 非常感谢!

【问题讨论】:

  • 我相信几年前,} 被调整为拒绝(信号错误)任何非矩形选择。所以我认为这是不可能的;我将不得不仔细检查。同时,您可以使用从} 派生的monad 来合并 两个数组,即:(1 (&lt; (&lt;0 1),(&lt;0 1) )} 4 4 $ 0) } _1 ,: i. 4 4。显然_1 ,: … 可以是你喜欢的任何东西,所以你可以在标量级别指定任意替换。
  • 好的,确认:} started signaling error on non-rectangular selections in J6.01 (2006)。我很难找到在此更改之前并证明此更改的 JForum 线程,但网络是您将无法通过使用 dyad n} 的巧妙索引以您想要的方式反转选择(除非您这样做索引集自己演算)。

标签: j


【解决方案1】:

“正确”的方式是使用exclude (&lt;):

(<< 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

【讨论】:

  • 我相信{ 对非矩形选择非常满意;它只是根据需要填充。但是} 没有;在我链接到的更改之前,} 还允许任意索引,但是在选择这些索引会导致 { 输出填充元素的情况下,相应的修改项都填充在 ravel 中的索引零处(即绝对第一个索引)经常互相覆盖,连续(因为你还要把它们放在哪里?在幕后 J 总是处理数组的散列,整数索引的填充元素是 0)。
  • 这组情况引起了混乱,即使在老将 Jers 中也是如此,而 Roger 无法想出一个合理且一致的方法来修正非矩形选择,所以他只是将其更改为拒绝它们。除了可能不必要的详细历史,我建议从您的句子中删除 { .. 不允许 {} 作为 .. i>.
  • 非常感谢所有 cmets、提示和代码。下面我列出了最终对我有用的内容(中间步骤的教育分解)。
  • @DanBron,感谢 cmets 的澄清。安息吧罗杰。
  • @Eelvex 是的,罗杰安息吧。这是一个真正的损失。
【解决方案2】:

标准方法是使用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 Engine 修改(自 J903 beta-r 起)可能允许您请求的形式(名词修饰符 })。

【讨论】:

    【解决方案3】:

    感谢大家的精彩提示和答案。带有中间步骤的最终解决方案(适合像我这样的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-22
      • 2022-01-18
      • 1970-01-01
      • 2017-12-28
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多