%
% La funcion S=gower(X,p1,p2,p3,k) calcula una matriz de similaridades,
% segun el coeficiente de similaridad de Gower.
%
% Entradas:
%   X   matriz de datos mixtos, cuyas columnas deben estar ordenadas
%           de la forma: continuas, binarias, categoricas,
%   p1  numero de variables continuas,
%   p2  numero de variables binarias,
%   p3  numero de variables categoricas (no binarias),
%   k   vector que contiene el numero de categorias de cada variable
%           categorica (no binaria) segun el orden de entrada.
%
 function S=gower(X,p1,p2,p3,k)
 [n,p]=size(X);
% matriz de variables cuantitativas
 X1=X(:,1:p1);
% matriz de variables binarias
 X2=X(:,p1+1:p1+p2);
% matriz de variables categoricas
 X3=X(:,p1+p2+1:p);
%
% calculos para las variables continuas
 rango=max(X1)-min(X1);
 for i=1:n
    c(i,i)=p1;
    for j=1:i-1
       c(i,j)=p1-sum(abs(X1(i,:)-X1(j,:))./rango);
       c(j,i)=c(i,j);
    end
 end
% calculo de las matrices a y d para las variables binarias
 J=ones(size(X2));
 a=X2*X2';
 d=(J-X2)*(J-X2)';
% calculos para las variables categoricas: cada variable
% categorica de k estados se transforma en k variables
% binarias que se yuxtaponen en una sola matriz Y1.
 Y1=zeros(n,k(1));
 for i=1:n
    Y1(i,X3(i,1))=1;
 end
 for j=2:p3
    Y=zeros(n,k(j));
    for i=1:n
       Y(i,X3(i,j))=1;
    end
    Y1=[Y1 Y];
 end
 alpha=Y1*Y1';
 % calculo del coeficiente de similaridad de Gower
 S=(c+a+alpha)./(p*ones(n)-d);