@Override public void merge(int i, int j) { float nij = n[i] + n[j]; for (int k = 0; k < i; k++) { proximity[index(i, k)] = (d(i, k) * n[i] + d(j, k) * n[j] - d(j, i) * n[i] * n[j] / nij) / nij; } for (int k = i+1; k < j; k++) { proximity[index(k, i)] = (d(k, i) * n[i] + d(j, k) * n[j] - d(j, i) * n[i] * n[j] / nij) / nij; } for (int k = j+1; k < size; k++) { proximity[index(k, i)] = (d(k, i) * n[i] + d(k, j) * n[j] - d(j, i) * n[i] * n[j] / nij) / nij; } n[i] += n[j]; } }
/** * Constructor. * @param proximity the proximity matrix to store the distance measure of * dissimilarity. To save space, we only need the lower half of matrix. */ public UPGMCLinkage(double[][] proximity) { init(proximity); n = new int[proximity.length]; for (int i = 0; i < n.length; i++) { n[i] = 1; } for (int i = 0; i < this.proximity.length; i++) { this.proximity[i] *= this.proximity[i]; } }
break; case UPGMC: link = new UPGMCLinkage(proximity); break; case WPGMA: