function [ V C eigVe ddd Cm ] = CoordBaseVP ( X, Massa, NPar, entQt, dimR, entQtF)
%
% Recebe a matriz das coordenadas das entidades na 'base das entidades'.
% Calcula o centro de massa (CM). Reescreve as coordenadas no referencial CM.
% Calcula a matriz de covariancia das coordenadas (ex-tensor de inercia).
% Calcula-se os seus valores e vectores proprios.
% E escrevem-se as coordenadas na base destes vectores proprios.
% Retorna o volume (V), as coordenadas na base dos vectores proprios (C) e
% uma matriz com os vectores proprios escritos no anterior base do ref. CM.
%
% X       - Coordenadas das entidades na base das distancias
% Massa   - Vector linha com as massas das diferentes entidades
% NPar    - Numero de parametros revelantes
% entQt   - Numero de entidades
% dimR    - Nova dimensao do espaco, depois de retiradas as
%           dimensoes menores do que 'min_dim'
% entQtF  - Factor multiplicativo do numero de entidades:
%              entQt = entQtF * entQtReal
%
% MassaD  - Matriz diagonal com as massas
% Cm      - Centro de massa
% Y       - Coordenadas no referencial do centro de massa
% T       - Tensor de covariancia das coordenadas
% C       - Coordenadas para a base dos vectores proprios
% V       - Volume dos 'NPar' mais revelantes
% ddd     - Valores proprios por ordem decrescente
%

%
% Calculo do centro de massa
%
MassaD = diag(Massa);
Cm = (Massa(1:entQt) * X) ./ sum(Massa(1:entQt));

%
% Coordenadas no referencial Centro de Massa 'Y'
%
Y = zeros (entQt, dimR);
for x=1:dimR
    Y(:,x) = X(:,x) - Cm(x);
end

%
% Calculo da matriz de covariancia 'T' das coordenadas (ex-inercia)
%
for x=1:dimR
    for y=1:dimR
        T(x,y) = Y(:,x)' * MassaD * Y(:,y);
    end
end
x1 = entQt / entQtF;
T = T ./ x1;

%
% Calculo dos valores e vectores proprios
%
[eigVe, eigVa] = eig(T);
dd = diag(eigVa);
ddus = sort(dd);

n1 = size(ddus,1);

n1I=n1-NPar+1;
if (n1I < 1) 
    n1I = 1; 
end;

V = 1;
for i1=n1I:n1
    V = V .* sqrt(ddus(i1)/ddus(n1));
    %fprintf ('VP[%d]: %d   \n', i1, ddus(i1));
end

ds = sort(dd)' ./ max(dd);

clear ma;
for k=1:dimR
    ma(k,1) = eigVa(k,k);
    ma(k,2) = k;
    ma(k,3) = dimR - k + 1;
end
ma = sortrows(ma,1);
ddd = ds(i1:-1:1);

%ma(dimR-4:dimR,1:3)

%
% Calculo das coordenadas de cada entidade na base dos vectores proprios
%
for x=1:dimR
    for y=1:entQt 
        C(y,x) = Y(y,:) * eigVe(:,ma(x,3));
    end
end

end

