In [ ]:
function [vectorized_image] = vectorize_image(image)
%fun = @(block_struct) imresize(block_struct.data,[1 400]);
im = double(image);
%vectorized_image = blockproc(im, [20 20], fun);
vectorized_image = im2col(image, [20 20], 'distinct')';
end



close all;
clear all;
load('PCA_Exercise_Images.mat')
vectorized_images = [];
images = {};
images{1} = Photo_Images;
images{2} = VTEC_Images;
imgindex = 1;
R= [1,10,80];
img = images{imgindex}; 
img_title = 'pca-part-c-VTEC_Images';
index = 170;

if (imgindex ==1)
    img_title = 'pca-part-c-Photo_Images';
    index = 70;
end
disp(img_title);
[nrow, ncol, nimg] = size(img);
original = double(img(:,:,index));

for j=1:numel(R)
    r= R(j);
    for i=1:nrow/20
        for j=1:ncol/20
            patch = original(20*(i-1)+1:20*(i), 20*(j-1)+1:20*j);
            vimg = double(vectorize_image(patch));
            vectorized_images = [vectorized_images; vimg];
        end
    end
    mean_patch = mean(vectorized_images);
    [eigvals, eigvecs, projected, reconstructed] = perform_pca(vectorized_images, r);

    imagesc(original);
    print(sprintf('%s-original', img_title), '-dpng');
    close all;

    rec_patches_all = [];
    rec_patches_temp = [];

    for i=1:(nrow*ncol)/400
        rec_patch = reshape(reconstructed(i, :),20,20);
        rec_patches_temp = [rec_patches_temp  rec_patch];
        if (mod(i,ncol/20)==0)
            %rest
            rec_patches_all= [rec_patches_all;rec_patches_temp];
            rec_patches_temp = [];

        end
    end

    %imagesc(reshape(reconstructed,600,600));
    imagesc(rec_patches_all);
    print(sprintf('%s-reconstructed-r=%d',img_title, r), '-dpng');
    close all;


    all_patch_minus_mean = bsxfun(@minus, vectorized_images, mean_patch);
    all_patch_minus_mean = all_patch_minus_mean.^2;
    euc_distance = sum(sqrt(sum(all_patch_minus_mean,2)))/(size(vectorized_images,1));
    total_variance = sum(eigvals);

    new_distance = bsxfun(@minus, reconstructed, mean_patch);
    new_distance = new_distance.^2;
    new_euc_distance = sum(sqrt(sum(new_distance,2)))/(size(vectorized_images,1));
    captured_variance = sum(eigvals(1:r));

    variance_ratio = captured_variance/total_variance;
    disp(sprintf('r=%f \t Captured Variance: %f',r, variance_ratio));
end