Assign

                Never    
function [cmcs,cmcsGraph,outliers] = ...
    CAssign(cmcs,outliers,dataPoint,radius,minThreshold,cmcsGraph,counter)
global callingTimesA timeTableA

numberOfcmcs = size(cmcs.Centre,1);
numberOfOutliers = size(outliers.Centre,1);

if (numberOfcmcs+numberOfOutliers)==0
    % No cmcs or outliers are present
    numberOfOutliers = numberOfOutliers + 1;
    outliers.Centre(numberOfOutliers,:) = dataPoint;
    outliers.Count(numberOfOutliers,:) = 1;
    outliers.Life(numberOfOutliers,:) = 1;
    outliers.pointsIndices{1} = counter;
    callingTimesA(counter) = 0 ;
    timeTableA(counter) = 0;
    return;
else
    % Compute the nearest cmcs or outliers
    centers = [cmcs.Centre;outliers.Centre];
    % calculate number of calling times
    callingTimesA(counter) = (size(centers,1));
    tic;
    distsPointCenters = pdist2(dataPoint,centers);
    timeTableA(counter) = (toc);
    [minDist,minDistIdx] = min(distsPointCenters);
    
    if minDist>radius
        % The point is not near to any CMCs or outliers
        numberOfOutliers = numberOfOutliers + 1;
        outliers.Centre(numberOfOutliers,:) = dataPoint;
        outliers.Count(numberOfOutliers,:) = 1;
        outliers.Life(numberOfOutliers,:) = 1;
        outliers.pointsIndices{numberOfOutliers,1} = counter;
        return;
    else
        if ismember(minDistIdx,1:numberOfcmcs)
            % The point is nearer to a CMC
            cmcs.Count(minDistIdx,:) = cmcs.Count(minDistIdx,:)+1;
            cmcs.Life(minDistIdx,:) = 1;
            cmcs.pointsIndices{minDistIdx,1} = [cmcs.pointsIndices{minDistIdx,1} counter];
            
            if minDist>radius*0.5 % if data point is inside cluster shell
                % Update cluster centre to mean of samples
                cmcs.Centre(minDistIdx,:) = ...
                    ((cmcs.Count(minDistIdx,:)-1)*cmcs.Centre(minDistIdx,:)+dataPoint)./cmcs.Count(minDistIdx,:);
                clusterChanged = minDistIdx;
            end
        else
            % The point is nearer to an outlier
            minDistIdx = minDistIdx - numberOfcmcs;
            outliers.Count(minDistIdx,:) = outliers.Count(minDistIdx,:)+1;
            outliers.Life(minDistIdx,:) = 1;
            outliers.pointsIndices{minDistIdx,1} = [outliers.pointsIndices{minDistIdx,1} counter];
            
            if minDist>radius*0.5 % if data point is inside cluster shell
                % Update outlier centre to mean of samples
                outliers.Centre(minDistIdx,:) = ...
                    ((outliers.Count(minDistIdx,:)-1)*outliers.Centre(minDistIdx,:)+dataPoint)./outliers.Count(minDistIdx,:);
            end
            
            % If an outlier becomes a CMC
            if outliers.Count(minDistIdx)>minThreshold
                numberOfcmcs = numberOfcmcs+1;
                cmcs.Centre(numberOfcmcs,:) = outliers.Centre(minDistIdx,:);
                cmcs.Count(numberOfcmcs,:) = outliers.Count(minDistIdx);
                cmcs.Life(numberOfcmcs,:) = 1;
                cmcs.pointsIndices{numberOfcmcs,1} = outliers.pointsIndices{minDistIdx};
                cmcsGraph = cmcsGraph.addnode(1);
                clusterChanged = numberOfcmcs;
                
                % Remove the outlier
                outliers.Centre(minDistIdx,:) = [];
                outliers.Count(minDistIdx,:) = [];
                outliers.Life(minDistIdx,:) = [];
                outliers.pointsIndices(minDistIdx,:) =[];
            end
        end
    end
end

% if a micro-cluster has changed and has enough data to not be noise then
% Update graph
if exist('clusterChanged','var')
    cmcsGraph = UpdateGraph(cmcsGraph,cmcs,clusterChanged,radius);
end


end

Raw Text