package ch.akuhn.isomap; import ch.akuhn.matrix.DenseMatrix; import ch.akuhn.matrix.Matrix; public class SwissRoll { public double[] x, y, z; public SwissRoll(int n) { x = new double[n]; y = new double[n]; z = new double[n]; for (int i = 0; i < n; i++) { double len = Math.PI * (Math.random() * 3 + 1); x[i] = Math.cos(len) * (1 + len / 4); y[i] = Math.sin(len) * (1 + len / 4); z[i] = Math.random() * 4 - 2; } } public Matrix asDistanceMatrix() { double[][] dist = new double[x.length][x.length]; for (int i = 0; i < x.length; i++) { for (int j = 0; j < x.length; j++) { dist[i][j] = dist(i,j); } } return new DenseMatrix(dist); } public double dist(int i, int j) { return Math.sqrt( (x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j]) + (z[i] - z[j]) * (z[i] - z[j])); } }