如果我有一个维度数据,例如
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
...,但他们都没有给我一个明确的结果。
任何人都可以帮我解决这个问题吗?谢谢!
答案 0 :(得分:1)
首先,我会注意到v2
通过在这些项目之间应用u
从u/~ 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