【发布时间】:2015-07-03 11:50:42
【问题描述】:
我有一个看起来像这样的数据集(原始数据是here):
var irisjson = [
{"sepalLength": 5.1, "sepalWidth": 3.5, "petalLength": 1.4, "petalWidth": 0.2, "species": "setosa"},
{"sepalLength": 4.9, "sepalWidth": 3.0, "petalLength": 1.4, "petalWidth": 0.2, "species": "setosa"},
{"sepalLength": 4.7, "sepalWidth": 3.2, "petalLength": 1.3, "petalWidth": 0.2, "species": "setosa"}....]
我想计算欧几里得距离并找到最近的点。我写的函数如下:
function findClosest(irisjson){
var result = [];
//Calculate Euc. Dist
for(var i=0; i < irisjson.length; i++){
for(var j = 1; j < irisjson.length-1 ; j++){
var a1, a2 , a3 , a4 ;
a1 = irisjson[i].sepalLength -
irisjson[j].sepalLength;
a2 = irisjson[i].sepalWidth -
irisjson[j].sepalWidth;
a3 = Math.pow(a1, 2);
a4 = Math.pow(a2, 2);
result[i] = Math.sqrt(a3 + a4);
}
console.log(result[i]);
}
}
当我将结果打印到控制台时,我在第一行看到1.1045361017187265。但是,当我手动测试它时,如下所示,我看到了结果0.5385164807134502:
a1 = irisjson[0].sepalLength -
irisjson[1].sepalLength;
a2 = irisjson[0].sepalWidth -
irisjson[1].sepalWidth;
a3 = Math.pow(a1, 2);
a4 = Math.pow(a2, 2);
result = Math.sqrt(a3 + a4);
console.log("res:", result);
关于为什么我会收到不同的结果有什么想法吗?
如果有任何帮助,我将不胜感激, 谢谢!
【问题讨论】:
-
我得到了您期望的结果 - 请参阅:jsfiddle.net/stvsg0we。也就是说,你不是(错误地)在'result[i] = Math.sqrt(a3 + a4);'这一行上覆盖以前的结果吗?
-
你是对的@JosephRedfern 它打印了三行 JSON 代码的正确结果。但我有一个更长的列表,它没有打印出正确的结果。这可能与您提到的重写有关。但我无法理解。你能试着解释更多吗?非常感谢!
-
您能否更新您的问题以包含更多数据,以便更容易重现问题?
-
我已经更新了问题@JosephRedfern 你可以从这里找到数据:raw.githubusercontent.com/vega/vega/master/examples/data/…
-
好的,我现在看到了问题——这是由于覆盖造成的。你想找到最近的一对点吗?
标签: javascript euclidean-distance