function [ Y, W, R, R_hat, X_hat ] = pca_transform( X, K )
    P = size(X, 2); %ilosc obserwacji - kolumn, ilosc zmiennych N - wierszy
    N = size(X, 1);

    % macierz korelacji
    R = (X * (X')) / P; %3x3

    % wartosci wlasne i wektory wlasne macierzy korelacji - posortowane
    % malejaco
    [V,D] = eig(R);
    [d,I] = sort(diag(D), 'descend');
    V_sorted = V(:, I); %3x3

    W = (V_sorted (:, 1:K))'; %2x3

    % odtworzenie macierzy korelacji
    L = diag (d (1:K)); %2x2
    R_hat = W' * L * W; %3x2 * 2x2 * 2x3 = 3x3

    % disp ('Macierz wartosci wlasnych: '); diag(d)
    % disp ('Macierz wektorow wlasnych: '); V_sorted
    
    % transformacja PCA
    Y = W * X; % 2x3 * 3x4 = 2x4

    % odtworzenie danych wejsciowych
    X_hat = W' * Y; % 3x2 * 2x4 = 3x4
end