function D = distmatrix(X)
% Berechnet die Distanzmatrix (analog zum Matlab-Befehl dist)

[m, n] = size(X);

% Speicher fuer Distanzmatrix reservieren. 
D = zeros(n, n);

% Verfahren
s = 0;

switch s
    case 2
        % Distanzmatrix mit zwei for-Schleifen berechnen. 
        for j = 2:n
            % Nur obere Dreiecksmatrix berechnen, da die Distanzmatrix 
            % symmetrisch ist.
            for i = 1:j-1  
                D(i, j) = norm(X(:,i) - X(:,j));
            end
        end
        % Untere Dreiecksmatrix hinzufuegen. 
        D = D + D';
    case 1
        % Distanzmatrix mit einer for-Schleife berechnen. 
        for i = 1:n
            D(i, :) = sqrt(sum((repmat(X(:,i), 1, n) - X).^2));
            %(repmat(X(:,i), 1, n) - X).^2) = x_i - x = [x_i x_i .. x_i] -
            % [x_1 x_2 ... x_n]; sum summiert die spalten auf; sqrt
            % berechnet die wurzel
        end
    otherwise
        % Distanzmatrix ohne for-Schleifen berechnen:
	% ||x - y||^2 = ||x||^2 - 2*x'*y + ||y||^2
        xx = sum(X.^2, 1);  % (1, n)-Vektor der quadratischen Terme x'*x. 
                            % sum(X,1) summiert die spalten und sum(X,2)
                            % die zeilen
        xy = X'*X;          % (n, n)-Matrix der gemischten Terme x'*y.
        D  = sqrt(repmat(xx, n, 1) - 2*xy + repmat(xx', 1, n));        
end
