function outputMatrix = SpectralClustering(A,k)
SpectralClusteringUnnormalized(A,k)

function laplaceMatrix = createLaplaceMatrix(A)

%dimensionen auslesen, wir gehen von spaltenvektoren aus.
[rows,columns] = size(A);

%Euklidische Abstände zwischen Punkten bestimmen.
distanceMatrix = squareform(pdist(A'));

%Ähnlichkeitsmatrix bestimmen (1/Abstand) und setze die Diagonale auf 0
similarityMatrix = ones(columns,columns) ./ distanceMatrix;
similarityMatrix(isinf(similarityMatrix)) = 0;

%erstelle die Diagonale der Laplace-Matrix
degreeMatrix = eye(columns,columns) .* repmat(sum(similarityMatrix),columns,1);

%erstelle die Laplace-Matrix
laplaceMatrix = degreeMatrix - similarityMatrix;

function outputMatrix = SpectralClusteringUnnormalized(A,k)
laplaceMatrix = createLaplaceMatrix(A);

[rows,columns] = size(A);

%errechne alle Eigenvektoren
[eigenvectors,eigenvalues] = eig(laplaceMatrix);

%der erste Eigenvektor ist der mit dem Eigenwert 0 und wird ausgelassen
firstKEigenvectors = eigenvectors( : , 2:(k+1) );

%Zeilenvektor der die Clusterzugehörigkeit der Vektoren anzeigt
clusterMembership = kmeans(firstKEigenvectors,k)'

%Aufblähen (ist das nötig??)
clusterMembership = repmat(clusterMembership,rows,1)

%Ab hier wird es abenteuerlich
for i = 1:k
    outputMatrix = [outputMatrix A(clusterMembership==i,:)];
end
outputMatrix = squareform(outputMatrix);
