J:有特定值的坐标



假设我们有一个数组

0 1 2 3 4 5 8 7 8 9

有两个值为8的索引:

(i.10) ([#~8={) 0 1 2 3 4 5 8 7 8 9
6 8

有更短的方法得到这个结果吗?可能是一些内置的动词

但更重要的是。那么更高的维度呢?假设我们有矩阵5x4

1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8

我想找出值为6的坐标是什么
我想得到这样的结果(有三个坐标):

4 1
3 2
2 3

这是一个非常基本的任务,我认为应该存在一些简单的解决方案。

三维相同吗?

谢谢

使用稀疏数组功能($.)提供了一个非常快速和精简的解决方案,也适用于多个维度。

   ]a=: 5 ] 1 + i. 8
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
   6 = a
0 0 0 0 0
0 0 0 0 1
0 0 0 1 0
0 0 1 0 0
   4 $. $. 6 = a
1 4
2 3
3 2

默认:

   getCoords=: 4 $. $.
   getCoords 6 = a ,: a
0 1 4
0 2 3
0 3 2
1 1 4
1 2 3
1 3 2

动词索引I.几乎可以完成任务。

当你有一个简单的列表,I.的使用是直接的:

I. 8 = 0 1 2 3 4 5 8 7 8 9
6 8 

对于高阶矩阵,您可以将其与反基#:配对以获得基$ matrix中的坐标。如:

]a =: 4 5 $ 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 4 5 6 7 8
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
I. 6 = ,a
9 13 17
($a) #: 9 13 17
1 4
2 3
3 2

同样,对于任意维度:flatten (,), compare (=), get index (I.) and convert coordinate (($a)&#:):

]coords =: ($a) #: I. 5 = , a =: ? 5 6 7 $ 10
0 0 2
0 2 1
0 2 3
...
(<"1 coords) { a
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
顺便说一下,您可以将I. x = y写成x (I.@:=) y以获得额外的性能。它是 的特殊代码

索引

相关内容

  • 没有找到相关文章

最新更新