protected double[][] calculateAssociationMatrix() {
		
		if( this.associationMatrix != null)
			return this.associationMatrix;
		if( this.clusterizedTrajectories == null)
			throw new RuntimeException("Error: impossible calculates the association matrix after the final calculation call");
		
		NodeIndexing nodeIndexing = this.clusterizedTrajectories.get(0).getNodeIndexing();
		
		// Association matrix initialization
		this.associationMatrix = new double[2][2];
		this.associationMatrix[0][0] = 0; this.associationMatrix[0][1] = 0; this.associationMatrix[1][0] = 0; this.associationMatrix[1][1] = 0;
		
		// Matrix calculation
		for(int iTrj1 = 0; iTrj1 < this.clusterizedTrajectories.size(); ++iTrj1) {
			IClassificationResult<TimeType> trj1 = this.clusterizedTrajectories.get( iTrj1);
			String cluster1 = trj1.getClassification();
			String tState1 = trj1.getNodeValue(0, nodeIndexing.getClassIndex());
			
			for(int iTrj2 = iTrj1 + 1; iTrj2 < this.clusterizedTrajectories.size(); ++iTrj2) {
				IClassificationResult<TimeType> trj2 = this.clusterizedTrajectories.get( iTrj2);
				boolean clEqual = cluster1.equals( trj2.getClassification());
				boolean tStateEqual = tState1.equals( trj2.getNodeValue(0, nodeIndexing.getClassIndex()));
				
				if( clEqual) {
					if( tStateEqual)
						++this.associationMatrix[0][0];	// SS
					else
						++this.associationMatrix[0][1];	// SD
				}else {
					if( tStateEqual)
						++this.associationMatrix[1][0];	// DS
					else
						++this.associationMatrix[1][1];	// DD
				}
			}
		}
		
		return this.associationMatrix;
	}