修改 j 中的子数组?

amend a subarray in place in j?

我有两种方法可以修改 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

我也试过递归拆分和粘合 table 一次分成四个“window 窗格”:

  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

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

我是不是错过了更好的选择?

我将从创建我想修改的索引集开始

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

我可以用它们来 select 我想要的原子 t

   ind { t
23 24
33 34
43 44

如果我可以 select 与他们一起,那么我可以使用相同的索引来修改 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

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

(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' 您的数组就位时,您实际上给了我解决方案。