diff --git a/99_HIDDEN_functions.R b/99_HIDDEN_functions.R
index b76a9d099e8d53a1f4d0940b4010c4f0c7f8708c..222457151b4639742eb03bd76452cc4ca87d9742 100644
--- a/99_HIDDEN_functions.R
+++ b/99_HIDDEN_functions.R
@@ -218,5 +218,62 @@ get.SES <- function(obs.df, perm.df, stat="RV") {
 
 ## Cracked version of matrix.x from SYNCSA to account for asymmetric binary variables in gowdis
 
+matrix.x <- function (comm, traits, scale = TRUE, ranks = TRUE, ord, notification = TRUE, 
+                      ...) 
+{
+  comm <- as.matrix(comm)
+  vartype <- var.type(traits)
+  if (any(vartype == "n")) {
+    stop("\n trait must contain only numeric, binary or ordinal variables \n")
+  }
+  if (missing(ord)) {
+    for (i in 1:length(vartype)) {
+      if (ranks & vartype[i] == "o") {
+        traits[, i] <- rank(traits[, i], na.last = "keep")
+      }
+      traits[, i] <- as.numeric(traits[, i])
+    }
+    traits <- as.matrix(traits)
+  }
+  matrix.w <- sweep(comm, 1, rowSums(comm, na.rm = TRUE), "/")
+  w.NA <- apply(matrix.w, 2, is.na)
+  matrix.w[w.NA] <- 0
+  if (notification) {
+    if (any(w.NA)) {
+      warning("Warning: NA in community data", call. = FALSE)
+    }
+  }
+  x.NA <- apply(traits, 2, is.na)
+  if (notification) {
+    if (any(x.NA)) {
+      warning("Warning: NA in traits matrix", call. = FALSE)
+    }
+  }
+  if (scale) {
+    dist.traits <- FD::gowdis(traits, ...)
+    similar.traits <- 1 - as.matrix(dist.traits)
+    matrix.traits <- 1/colSums(similar.traits, na.rm = TRUE)
+    matrix.u <- sweep(similar.traits, 1, matrix.traits, "*")
+  }
+  else {
+    dist.traits <- as.matrix(vegan::vegdist(traits, method = "euclidean", 
+                                            diag = TRUE, upper = TRUE, na.rm = TRUE))
+    similar.traits <- 1 - (dist.traits/max(dist.traits, na.rm = TRUE))
+    matrix.traits <- 1/colSums(similar.traits, na.rm = TRUE)
+    matrix.u <- sweep(similar.traits, 1, matrix.traits, "*")
+  }
+  u.NA <- apply(matrix.u, 2, is.na)
+  if (notification) {
+    if (any(u.NA)) {
+      warning("Warning: NA in matrix U", call. = FALSE)
+    }
+  }
+  matrix.u[u.NA] <- 0
+  matrix.X <- matrix.w %*% matrix.u
+  return(list(matrix.w = matrix.w, matrix.u = matrix.u, matrix.X = matrix.X))
+}
+
+
+