docs: private static double[][] getFactorMatrixUsingCommonsMath(double[][] correlationMatrix, int numberOfFactors) {
  		/*
  		 * Factor reduction
  		 */
  		// Create an eigen vector decomposition of the correlation matrix
  		double[]	eigenValues;
  		double[][]	eigenVectorMatrix;
  
  		if(isEigenvalueDecompositionViaSVD) {
  			SingularValueDecomposition svd = new SingularValueDecomposition(new Array2DRowRealMatrix(correlationMatrix));
  			eigenValues = svd.getSingularValues();
  			eigenVectorMatrix = svd.getV().getData();
  		}
  		else {
  			EigenDecomposition eigenDecomp = new EigenDecomposition(new Array2DRowRealMatrix(correlationMatrix, false));
  			eigenValues			= eigenDecomp.getRealEigenvalues();
  			eigenVectorMatrix	= eigenDecomp.getV().getData();
  		}
  
  		class EigenValueIndex implements Comparable<EigenValueIndex> {
  			private int	index;
  			private Double value;
  
  			EigenValueIndex(int index, double value) {
  				this.index = index; this.value = value;
  			}
  
  			@Override
  			public int compareTo(EigenValueIndex o) { return o.value.compareTo(value); }
  		}
  		List<EigenValueIndex> eigenValueIndices = new ArrayList<>();
  		for(int i=0; i<eigenValues.length; i++) {
  			eigenValueIndices.add(i,new EigenValueIndex(i,eigenValues[i]));
  		}
  		Collections.sort(eigenValueIndices);
  
  		// Extract factors corresponding to the largest eigenvalues
  		double[][] factorMatrix = new double[eigenValues.length][numberOfFactors];
  		for (int factor = 0; factor < numberOfFactors; factor++) {
  			int		eigenVectorIndex	= eigenValueIndices.get(factor).index;
  			double	eigenValue			= eigenValues[eigenVectorIndex];
  			double	signChange			= eigenVectorMatrix[0][eigenVectorIndex] > 0.0 ? 1.0 : -1.0;		// Convention: Have first entry of eigenvector positive. This is to make results more consistent.
  			double  eigenVectorNormSquared     = 0.0;
  			for (int row = 0; row < eigenValues.length; row++) {
  				eigenVectorNormSquared += eigenVectorMatrix[row][eigenVectorIndex] * eigenVectorMatrix[row][eigenVectorIndex];
  			}
  			eigenValue = Math.max(eigenValue,0.0);
  			for (int row = 0; row < eigenValues.length; row++) {
  				factorMatrix[row][factor] = signChange * Math.sqrt(eigenValue/eigenVectorNormSquared) * eigenVectorMatrix[row][eigenVectorIndex];
  			}
  		}
  
  		return factorMatrix;
  	}