【发布时间】: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