function doubleClustering(matrix, rowNames, colNames, metric = euclideanDistance) {
const distanceMatrix = createDistanceMatrix(matrix, metric, false);
let rowOrder = flatten(upgma(distanceMatrix).slice(-1)).slice(0, upgma(distanceMatrix).length+1)
const transposedMatrix = matrix[0].map((_, i) => matrix.map((row) => row[i]));
const distanceMatrixTransposed = createDistanceMatrix(transposedMatrix, metric, false);
let colOrder = flatten(upgma(distanceMatrixTransposed).slice(-1)).slice(0, upgma(distanceMatrixTransposed).length+1)
const sortedMatrix = rowOrder.map((i) => colOrder.map((j) => matrix[i][j]));
const sortedRowNames = rowOrder.map(i => rowNames[i]);
const sortedColNames = colOrder.map((i) => colNames[i]);
return {
matrix: sortedMatrix,
rowNames: sortedRowNames,
colNames: sortedColNames,
};
}