如何在 J 中使用索引函数定义选择

How to define selection using index function in J

假设我有以下张量 t:

   ]m=: 100 + 4 4 $ i.16
100 101 102 103
104 105 106 107
108 109 110 111
112 113 114 115
   ]t=: (m ,: m+100) , m+200
100 101 102 103
104 105 106 107
108 109 110 111
112 113 114 115

200 201 202 203
204 205 206 207
208 209 210 211
212 213 214 215

300 301 302 303
304 305 306 307
308 309 310 311
312 313 314 315

我想select它的对角平面,所以:

100 105 110 115

200 205 210 215

300 305 310 315

如何定义作用于索引的函数? (这里有任何平面索引让我们选择 ix(row) = ix (column))另外,如何定义同时处理值和索引的函数?所以我会对这样的东西感兴趣:

(f t) { t

谢谢!

您可以使用 (#:i.)@$ m

将值数组转换为其对应的索引数组

举个例子f“一起处理值和索引”然后你可以将它作为一个二元体插入,它在左边取值,在右边取索引:

  f=.(2|[) +. ([:=/"1]) NB. odd value or diagonal index
  ]r=.([ f (#:i.)@$) m  NB. values f indices
1 1 0 1
0 1 0 1
0 1 1 1
0 1 0 1
  r #&, m               NB. flatten lists & get values where bit is set
100 101 103 105 107 109 110 111 113 115

一切都包裹在可以应用的副词中f:

  sel=.1 : '#~&, [ u (#:i.)@$`
  f sel m
100 101 103 105 107 109 110 111 113 115

Transpose x|:y 带盒装参数将轴一起运行以产生单个轴。您可以使用它来生成一个相当地道的解决方案:

(< 0 1) |: m
100 105 110 115

(<0 1) |:"2 t
100 105 110 115
200 205 210 215
300 305 310 315

使用 rank " 动词将对角线选择应用到 2-boxes。