J中Rank的概念

时间:2018-06-01 19:41:17

标签: j

如果我有一个维度数据,例如

v1 =: 5 $ i.5
v1
0 1 2 3 4

然后v1 -"1 0 v1给了我像

这样的欧几里德向量
v1 -"1 0 v1
 0  1  2  3 4
_1  0  1  2 3
_2 _1  0  1 2
_3 _2 _1  0 1
_4 _3 _2 _1 0

我们也可以轻松找到欧几里德距离矩阵。

这就是我如何找到欧洲矢量和2D矢量的距离矩阵

 v2=: <"1 ? 5 2 $ 10
   v2
┌───┬───┬───┬───┬───┐
│4 0│4 5│5 7│8 3│6 0│
└───┴───┴───┴───┴───┘
direction_vector=: <"1 @: (-"0 @:(-/"2 @: (>"0 @: (diff))))
distance =:     +/"1 @: *: @: (>"2 @:(direction_vector))
m =:        3 : '(i.(#y)) distance"0 _ y'
m v2
 0 25 50 25  4
25  0  5 20 29
50  5  0 25 50
25 20 25  0 13
 4 29 50 13  0

然而,我的问题是我不知道如何以智能和干净的方式找到欧几里德矢量和2D数据的距离

从下表中可以看出,我的算法花费了超过1/3的时间来计算数据的方向向量。 14.5秒也不错,但是当我有一个更大的数据集时会出现问题。

 Time (seconds)
+----------------+------+--------+---------+-----+----+------+
|name            |locale|all     |here     |here%|cum%|rep   |
+----------------+------+--------+---------+-----+----+------+
|direction_vector|base  |6.239582| 5.105430| 35.2| 35 |773040|
|move            |base  |9.741510| 1.753868| 12.1| 47 |  3390|
|script          |base  |1.969949| 1.443148|  9.9| 57 |    18|
|distance        |base  |5.650358| 1.318022|  9.1| 66 |579780|
|enclosestrings  |pcsv  |1.491832| 1.255603|  8.6| 75 |     1|
|diff            |base  |1.134585| 1.134585|  7.8| 83 |773186|
|makedsv         |pcsv  |1.728721| 0.236883|  1.6| 84 |     4|
|norm            |base  |0.221794| 0.221794|  1.5| 86 |  3390|
|xpt             |base  |0.194896| 0.194896|  1.3| 87 |  3390|
|ypt             |base  |0.193579| 0.193579|  1.3| 89 |  3390|
|writedsv        |pcsv  |2.067408| 0.186687|  1.3| 90 |     4|
|cosd            |base  |0.172359| 0.172359|  1.2| 91 |   113|
|[rest]          |      |        | 1.300733|  9.0|100 |      |
|[total]         |      |        |14.517587|100.0|100 |      |
+----------------+------+--------+---------+-----+----+------+

我认为我绝对可以通过使用rank来简化direction_vector,但是我被卡住了。我尝试了"2 1 "1 1 "1 2 "_ 1 "1 0 ...,但他们都没有给我一个明确的结果。

任何人都可以帮我解决这个问题吗?谢谢!

2 个答案:

答案 0 :(得分:1)

首先,我会注意到v2通过在这些项目之间应用uu/~ v2的项目中创建了一个表格。此外,您可以使用与v2 u/ v2相同的u来简化此操作。接下来的问题是什么是 [ v2=: 5 2 $ 4 0 4 5 5 7 8 3 6 0 4 0 4 5 5 7 8 3 6 0 ,但在我们去那里之前,拳击确实减慢了事情的速度,你实际上不需要为此工作包装,因为这些项目已经可以像这样编写:

u/~ v2

这使得项目成为向量,这是您希望能够使用的u

现在,回到我们想要v2的问题。我们将处理u的项目,因为v2正在使用+/@:*:@:-"1的项目来制作表格,您希望将这些项目作为向量相互减去(等级1)然后将它们平方然后将它们加在一起。将其翻译为J,您将获得u作为 +/@:*:@:-"1/~ v2 0 25 50 25 4 25 0 5 20 29 50 5 0 25 50 25 20 25 0 13 4 29 50 13 0

/

如果你计时,我希望你会发现它比你的解决方案快得多,因为它不需要拳击。您关注排名的关键领域是在表副词 ArrayList<Integer> integerArrayList= new ArrayList<>(); //calling this below each time hitting the button int theInt=Integer.parseInt(txt.getText().toString()); integerArrayList.add(theInt);

之后应用它

希望这有帮助,即使这是一个稍微不同的方法,让我知道你的时间是什么样的。

答案 1 :(得分:1)

新答案,以便我可以正确格式化结果。

看看你的结果我认为至少通过我的测量还有进一步改进的空间。通过改变+ /到+ /&#34; 1来摆脱隐性方法并转向顺序应用程序,速度大约是其两倍。

^T2