function [] = drawfuzzycluster(X, A, f, lim)
% function [] = drawfuzzycluster(X, A, f, lim)
% disegna il grafico dei cluster assegnando un punto ad un cluster se la membership
% di appartenenza e' superiore a lim. Se lim = 0 assegna alla classe di valore max
%Input:
% X      : matrice dei dati di input. 
%          Formato: [n,m]=size(X) con n numero dei pattern ed m dimensione dei pattern.
% A      : Matrice delle membership funtion dei cluster.
%          Formato: [c,n]=size(A)
%          c = numero dei cluster
%          n = numero dei pattern di input 
% f      : indice i fuzziness
% lim    : membership limite per l' apparteneza ad un cluster
if nargin == 2
    lim = 0;
    f = 1.01;
elseif nargin < 2
    error('drawfuzzycluster(X, A, f, lim)');
end

marker =  [
            'x'  % no assignement
            'o'  % 1st cluster
            's'  % 2nd cluster
            '+'  % 3rd cluster
            '*'  % 4th cluster
            'd'  % 5th cluster
            '^'  % 6th cluster
            'v'  % 7th cluster
            '>'  % 8th cluster
            '<'  % 9th cluster
            'p'  % 10th cluster
            'h'  % 11th cluster
        ];
            
[c,n] = size(A);
H = AssignPatterns(A, lim);

% prepare the cell arrays D of the different clusters
for k=0:c
    i=0;
    for j=1:n
        if H(j) == k
            i=i+1;
            D{k+1}(i,:) = X(j,:);
        end
    end
end

figure;
for k=0:c
    if ~isempty(D{k+1})
        plot(D{k+1}(:,1),D{k+1}(:,2),marker(k+1));
        hold on;
    end
    end
ss = ['Fuzzy c-means:   ',  num2str(c), ' clusters     ', 'fuzziness = ', num2str(f), '    \alpha level = ', num2str(lim)];
title(ss);
xlabel('X');
ylabel('Y');
hold off;


function H = AssignPatterns(A, lim)
% Assegna i pattern alle classi in modo crisp
%Input:
% A      : Matrice delle membership funtion dei cluster.
%          Formato: [c,n]=size(A)
%          c = numero dei cluster
%          n = numero dei pattern di input 
% lim   :  limite valore di membership per assegnazione di un pattern ad un cluster
%          se lim = 0, assegnazione al cluster con membership massima. 
%Output:
% H      : Vettore di assegnazione dei pattern ai cluster
%          Formato: n=length(H)
%          n = numero dei pattern di input
%          H(i) memoriza il cluster  di appartenenza dell' iesimo pattern. 
%          L' etichetta del cluster corrisponde all' indice della riga
%          della matrice A. H(i) = 0 significa che l' iesimo pattern non è
%          stato assegnato ad alcun cluster

% 
[m,n]=size(A);
for k=1:n
    maxvalue = -1;
    maxcluster = 0;
    for j=1:m
        if A(j,k)>maxvalue
            maxvalue = A(j,k);
            maxcluster = j;
        end
    end
    if maxvalue < lim
        maxcluster = 0;
    end
    MaxVal(k).value = maxvalue;
    MaxVal(k).cluster = maxcluster;
end

H = [MaxVal.cluster];
