function poblacion = LinealDiscrimK(x,X,vector_n) 

% LinealDiscrimK(x,X,vector_n)
% Regla discriminante lineal para cualquier numero K de poblaciones
% Clasifica x en alguna de las K poblaciones utilizando la regla discriminante lineal.
% Variables de entrada:
%   x Observacion a clasificar: vector de p componentes
%   vector_n Vector de dimension Kx1, que contiene n1, n2, ..., nK, siendo 
%            ni el numero de observaciones en la poblacion i, para
%            i=1,2,...,K.
%   X Matriz de datos de dimension nxp, con n=n1+n2+...+nK, que contiene
%   las matrices de datos X1, X2, ..., XK de las poblaciones puestas en
%   orden una encima de la otra.
x = x(:) ; px = length(x) ;
K = length(vector_n) ;
[n,p] = size(X) ;

if px ~= p
    error('La dimension de x no es coherente con la de la matriz de datos X')
else 
    clear px
end 

mMatriz = zeros(K,p) ; S = zeros(p) ;

for i=1:K
    if i ~= 1
        Fila1 = sum(vector_n([1:i-1]))+1 ; Filani = Fila1 -1 + vector_n(i) ; 
    else
        Fila1 = 1 ; Filani = vector_n(1) ;
    end    
    Xi = X([Fila1:Filani],:) ;
    mMatriz(i,:) = mean(Xi) ;
    Si = cov(Xi) ;
    S = S + (vector_n(i)-1) * Si ;
end

S = S/(sum(vector_n)-K) ;
x_rep = (ones(K,1) * x') - mMatriz ;
D2 = diag( x_rep * inv(S) * x_rep' ) ;
[D2min,poblacion] = min(D2) ;