【问题标题】:amend a subarray in place in j?修改 j 中的子数组?
【发布时间】:2021-07-13 12:28:39
【问题描述】:

我有两种方法可以修改 J 中的子数组,但我不喜欢其中任何一种。

(想象一下在绘图程序中选择一个矩形并应用一些任意 对该矩形进行操作。)

  t =. i. 10 10         NB. table to modify
  xy=. 2 3 [ wh =. 3 2  NB. region i want want to modify
  u =. -@|.             NB. operation to perform on region

我可以获取子数组并应用 使用 cut (;.0) 一步操作:

  st =. ((,./xy),:(|,./wh)) u;.0 t

把它放回去很容易,但似乎需要 构建一个大的盒装索引数组:

  (,st) (xy&+each,{;&:i./wh) } t

我还尝试了递归拆分和粘合 表格一次分成四个“窗格”:

  split =: {. ; }.  NB. split y into 2 subarrays at index x
  panes =: {{ 2 2$ ; |:L:0 X split&|:&.> Y split y [ 'Y X'=.x }}
  glue =: [: ,&>/ ,.&.>/"1  NB. reassamble

  xy panes t
┌────────┬────────────────────┐
│ 0  1  2│ 3  4  5  6  7  8  9│
│10 11 12│13 14 15 16 17 18 19│
├────────┼────────────────────┤
│20 21 22│23 24 25 26 27 28 29│
│30 31 32│33 34 35 36 37 38 39│
│40 41 42│43 44 45 46 47 48 49│
│50 51 52│53 54 55 56 57 58 59│
│60 61 62│63 64 65 66 67 68 69│
│70 71 72│73 74 75 76 77 78 79│
│80 81 82│83 84 85 86 87 88 89│
│90 91 92│93 94 95 96 97 98 99│
└────────┴────────────────────┘

NB. then split the lower right pane again,
NB. extract *its* upper left pane...
s0 =.  1 1 {:: p0 =. xy panes t
s1 =. 0 0 {:: p1 =. wh panes s0

NB. apply the operation and reassemble:
p1a =. (<u s1) (<0 0) } p1
glue (<glue p1a) (<1 1) } p0

第一种方法似乎更快更 更简单的选择,但感觉应该有 是一种更原始​​的方式来应用动词 at 一个子数组而不提取它,或者粘贴 在某个坐标的子数组中,无需手动 为每个元素创建索引数组。

我错过了更好的选择吗?

【问题讨论】:

    标签: j


    【解决方案1】:

    我将首先创建一组我想要修改的索引

    [ ind =. < xy + each i. each wh
        ┌───────────┐
        │┌─────┬───┐│
        ││2 3 4│3 4││
        │└─────┴───┘│
        └───────────┘
    

    我可以使用它们从t中选择我想要的原子

       ind { t
    23 24
    33 34
    43 44
    

    如果我可以选择它们,那么我可以使用相同的索引来修改t

       _ ind } t
     0  1  2  3  4  5  6  7  8  9
    10 11 12 13 14 15 16 17 18 19
    20 21 22  _  _ 25 26 27 28 29
    30 31 32  _  _ 35 36 37 38 39
    40 41 42  _  _ 45 46 47 48 49
    50 51 52 53 54 55 56 57 58 59
    60 61 62 63 64 65 66 67 68 69
    70 71 72 73 74 75 76 77 78 79
    80 81 82 83 84 85 86 87 88 89
    90 91 92 93 94 95 96 97 98 99
    

    最后我可以在预处理t 和右齿(ind u@{ ]) 后使用左齿为ind}~ 的钩子来获得我的结果

    (ind}~ ind u@{ ]) t
         0  1  2   3   4  5  6  7  8  9
        10 11 12  13  14 15 16 17 18 19
        20 21 22 _43 _44 25 26 27 28 29
        30 31 32 _33 _34 35 36 37 38 39
        40 41 42 _23 _24 45 46 47 48 49
        50 51 52  53  54 55 56 57 58 59
        60 61 62  63  64 65 66 67 68 69
        70 71 72  73  74 75 76 77 78 79
        80 81 82  83  84 85 86 87 88 89
        90 91 92  93  94 95 96 97 98 99
    

    当您询问如何“修改”您的阵列时,您实际上给了我解决方案。

    【讨论】:

    • 太棒了!是的,我很生气,因为我认为 Amend 缺少一个功能。我只是没有意识到我在那里的文档中看到了什么。我仍然认为,能够仅指定 xy 和 wh 进行切割,但不能在其他任何地方使用这种形式的索引,这会破坏对称性,但这会很好。谢谢!
    猜你喜欢
    • 2019-05-08
    • 2012-04-17
    • 1970-01-01
    • 2023-04-05
    • 2014-04-21
    • 2021-05-19
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多