我有一个CSV文件,第一列是ID,另一个是测量,如何计算数据的欧氏距离。我使用Readcsv读取文件,然后我试图计算距离,但我有错误。我只需要读取列作为双数据计算距离并将ID与X1,X2的值分开。用其ID打印每个距离。
double[][] Data = ReadCSV.read("C:\\Users\\navien\\Desktop\\dataset3.csv", 263, false);
double Sum = 0.0;
double distances;
for(int i=0;i<Data.length;i++) {
for ( int j=i+1; j<Data[0].length;j++){
Sum = Sum + Math.pow((Data[i][j]-Data[i][j]),2.0); // the file compost of three column
}
}
distances = Math.sqrt(Sum);
答案 0 :(得分:0)
下面
Sum = Sum + Math.pow((Data[i][j]-Data[i][j]),2.0)
您减去相等的数字(Data[i][j]-Data[i][j])
,因此结果将始终为0.
此方法计算欧氏距离,其中文件中的每列代表该点的坐标。
public static void euclidianDistanceFromFile(String path) throws IOException {
BufferedReader br = new BufferedReader(new FileReader(path));
String line;
while ((line = br.readLine()) != null) {
if (line.contains("ID")) continue;
String[] arr = line.split(",");
String name = arr[0];
double p = Double.parseDouble(arr[1]);
double q = Double.parseDouble(arr[2]);
double res = Math.sqrt((p - q) * (p - q));
System.out.println(name + ": " + res);
}
}
答案 1 :(得分:0)
你需要安排你的线路阅读器来存储前一行数据的x和y(比如x1,y1),以及当前行的x和y(比如x2,y2)
然后,毕达哥拉斯的应用&#39;定理,给出
Sum = Sum + Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1))
Sum
将是按照它们在您的文件中出现的顺序连接点的锯齿状线的长度。