%% Loops and Vectorization II

%%
% As a second example we perform matrix-vector multiplication
%
% Define the size of the problem
n = 2000;

%%
% Next compute a random matrix and right-hand side vector
A = rand(n);
b = rand(n,1);

%%
% How long does a double for-loop take?
tic;                % start timer
y = zeros(n,1);     % pre-allocate to make more efficient
for j=1:n
    for k=1:n
        y(j) = y(j) + A(j,k)*b(k);
    end
end
t1 = toc;           % end timer
fprintf('Time with for-loop: %f seconds\n\n', t1)

%%
% Now vectorized as a series of dot products (with single for-loop)
tic;                % start timer
y = zeros(n,1);     % pre-allocate to make more efficient
for j=1:n
    y(j) = A(j,:)*b;
end
t2 = toc;           % end timer
fprintf('Time dot products: %f seconds\n\n', t2)

%%
% Fully vectorized
clear y            % start with a clean slate 
tic;               % start timer
y = A*b;
t3 = toc;          % end timer
fprintf('Time vectorized: %f seconds\n\n', t3)
