You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.5 KiB
77 lines
2.5 KiB
//
|
|
// C++ standalone verion of fastcluster by Daniel Muellner
|
|
//
|
|
// Copyright: Daniel Muellner, 2011
|
|
// Christoph Dalitz, 2018
|
|
// License: BSD style license
|
|
// (see the file LICENSE for details)
|
|
//
|
|
|
|
#ifndef fastclustercpp_H
|
|
#define fastclustercpp_H
|
|
|
|
//
|
|
// Assigns cluster labels (0, ..., nclust-1) to the n points such
|
|
// that the cluster result is split into nclust clusters.
|
|
//
|
|
// Input arguments:
|
|
// n = number of observables
|
|
// merge = clustering result in R format
|
|
// nclust = number of clusters
|
|
// Output arguments:
|
|
// labels = allocated integer array of size n for result
|
|
//
|
|
void cutree_k(int n, const int* merge, int nclust, int* labels);
|
|
|
|
//
|
|
// Assigns cluster labels (0, ..., nclust-1) to the n points such
|
|
// that the hierarchical clsutering is stopped at cluster distance cdist
|
|
//
|
|
// Input arguments:
|
|
// n = number of observables
|
|
// merge = clustering result in R format
|
|
// height = cluster distance at each merge step
|
|
// cdist = cutoff cluster distance
|
|
// Output arguments:
|
|
// labels = allocated integer array of size n for result
|
|
//
|
|
void cutree_cdist(int n, const int* merge, double* height, double cdist, int* labels);
|
|
|
|
//
|
|
// Hierarchical clustering with one of Daniel Muellner's fast algorithms
|
|
//
|
|
// Input arguments:
|
|
// n = number of observables
|
|
// distmat = condensed distance matrix, i.e. an n*(n-1)/2 array representing
|
|
// the upper triangle (without diagonal elements) of the distance
|
|
// matrix, e.g. for n=4:
|
|
// d00 d01 d02 d03
|
|
// d10 d11 d12 d13 -> d01 d02 d03 d12 d13 d23
|
|
// d20 d21 d22 d23
|
|
// d30 d31 d32 d33
|
|
// method = cluster metric (see enum method_code)
|
|
// Output arguments:
|
|
// merge = allocated (n-1)x2 matrix (2*(n-1) array) for storing result.
|
|
// Result follows R hclust convention:
|
|
// - observabe indices start with one
|
|
// - merge[i][] contains the merged nodes in step i
|
|
// - merge[i][j] is negative when the node is an atom
|
|
// height = allocated (n-1) array with distances at each merge step
|
|
// Return code:
|
|
// 0 = ok
|
|
// 1 = invalid method
|
|
//
|
|
int hclust_fast(int n, double* distmat, int method, int* merge, double* height);
|
|
enum hclust_fast_methods {
|
|
HCLUST_METHOD_SINGLE = 0,
|
|
HCLUST_METHOD_COMPLETE = 1,
|
|
HCLUST_METHOD_AVERAGE = 2,
|
|
HCLUST_METHOD_MEDIAN = 3,
|
|
HCLUST_METHOD_CENTROID = 5,
|
|
};
|
|
|
|
void hclust_pdist(int n, int m, double* pts, double* out);
|
|
void cluster_points_centroid(int n, int m, double* pts, double dist, int* idx);
|
|
|
|
|
|
#endif
|
|
|