38 void cutree_k(
int n,
const int *merge,
int nclust,
int *labels)
43 if (nclust > n || nclust < 2) {
44 for (j = 0; j < n; j++)
51 std::vector<int> last_merge(n, 0);
52 for (k = 1; k <= (n - nclust); k++) {
55 m2 = merge[n - 1 + k - 1];
56 if (m1 < 0 && m2 < 0) {
57 last_merge[-m1 - 1] = last_merge[-m2 - 1] = k;
58 }
else if (m1 < 0 || m2 < 0) {
65 for (l = 0; l < n; l++)
66 if (last_merge[l] == m1)
68 last_merge[j - 1] = k;
70 for (l = 0; l < n; l++) {
71 if (last_merge[l] == m1 || last_merge[l] == m2)
79 std::vector<int> z(n, -1);
80 for (j = 0; j < n; j++) {
81 if (last_merge[j] == 0) {
84 if (z[last_merge[j]] < 0) {
85 z[last_merge[j]] = label++;
87 labels[j] = z[last_merge[j]];
104 void cutree_cdist(
int n,
const int *merge,
double *height,
double cdist,
int *labels)
109 for (k = 0; k < (n - 1); k++) {
110 if (height[k] >= cdist) {
141 int hclust_fast(
int n,
double *distmat,
int method,
int *merge,
double *height)
148 MST_linkage_core(n, distmat, Z2);
151 NN_chain_core<METHOD_METR_COMPLETE, t_float>(n, distmat,
nullptr, Z2);
154 auto *members =
new double[n];
155 for (
int i = 0; i < n; i++)
157 NN_chain_core<METHOD_METR_AVERAGE, t_float>(n, distmat, members, Z2);
161 generic_linkage<METHOD_METR_MEDIAN, t_float>(n, distmat,
nullptr, Z2);
166 int *order =
new int[n];
168 generate_R_dendrogram<true>(merge, height, order, Z2, n);
170 generate_R_dendrogram<false>(merge, height, order, Z2, n);