%% Assignment 2
% Name: Claudio Maggioni
%
% Date: 19/3/2019
%
% This is a template file for the first assignment to get started with running
% and publishing code in Matlab.  Each problem has its own section (delineated
% by |%%|) and can be run in isolation by clicking into the particular section
% and pressing |Ctrl| + |Enter| (evaluate current section).
%
% To generate a pdf for submission in your current directory, use the following
% three lines of code at the command window:
%
%  >> options.format = 'pdf'; options.outputDir = pwd; publish('assignment2.m', options)
%

%% Problem 3

syms x;

f = exp(x);
df = diff(f);
x_0 = 1;
err = zeros(10, 1);
h = zeros(10, 1);

for i = 1:10
    h(i) = 10^(-i);
    err(i) = abs(subs(df,x,x_0) - my_diff(f, x, x_0, h(i)));
end

loglog(h, err)

%% Problem 6

n = 3000;
A = rand(n,n);
B = rand(n,n);
tic
[C] = matTimesMat_classical(A, B); 
toc
norm(C - A * B) / norm(C) 
tic
[C] = matTimesMat_column(A, B); 
toc
norm(C - A * B) / norm(C)
tic
[C] = matTimesMat_outerProd(A, B); 
toc
norm(C - A * B) / norm(C)

%% Problem 3 (functions)

function approx = my_diff(f, x, x_0, h)
    approx = (subs(f,x,x_0 + h) - subs(f, x, x_0)) / h;
end

%% Problem 6 (functions)

function [C] = matTimesMat_classical(A, B)
s = size(A);
n = s(1);
C = zeros(n);
for i=1:n
    for j=1:n
        for k=1:n
            C(i,j) = C(i,j) + A(i,k) * B(k,j);
        end
    end
end
end

function [C] = matTimesMat_column(A, B)
s = size(A);
n = s(1);
C = zeros(n);
for j=1:n
    for k=1:n
        C(:,j) = C(:,j) + B(k,j) * A(:,k);
    end
end
end

function [C] = matTimesMat_outerProd(A, B)
s = size(A);
n = s(1);
C = zeros(n);
for j=1:n
    C = C + A(:,j) * B(j,:);
end
end