mp4: done 1a-c in MATLAB
This commit is contained in:
parent
13522202fc
commit
34b290c569
32 changed files with 1113 additions and 0 deletions
15
mp4/Makefile
Normal file
15
mp4/Makefile
Normal file
|
@ -0,0 +1,15 @@
|
|||
filename=template
|
||||
|
||||
pdf:
|
||||
pdflatex ${filename}
|
||||
#bibtex ${filename}
|
||||
pdflatex ${filename}
|
||||
pdflatex ${filename}
|
||||
make clean
|
||||
|
||||
read:
|
||||
evince ${filename}.pdf &
|
||||
|
||||
|
||||
clean:
|
||||
rm -f *.out *.log *.bbl *.blg *.aux ${filename}.log ${filename}.ps ${filename}.aux ${filename}.out ${filename}.dvi ${filename}.bbl ${filename}.blg
|
30
mp4/Project_4_Maggioni_Claudio.tex
Normal file
30
mp4/Project_4_Maggioni_Claudio.tex
Normal file
|
@ -0,0 +1,30 @@
|
|||
\documentclass[unicode,11pt,a4paper,oneside,numbers=endperiod,openany]{scrartcl}
|
||||
|
||||
\input{assignment.sty}
|
||||
|
||||
|
||||
|
||||
|
||||
\begin{document}
|
||||
|
||||
|
||||
\setassignment
|
||||
\setduedate{Wednesday, 18 November 2020, 11:55 PM}
|
||||
|
||||
\serieheader{Numerical Computing}{2020}{Student: FULL NAME}{Discussed with: FULL NAME}{Solution for Project 4}{}
|
||||
\newline
|
||||
|
||||
\assignmentpolicy
|
||||
|
||||
|
||||
\begin{enumerate}
|
||||
|
||||
\item \textbf{Spectral clustering of non-convex sets [60 points]:}
|
||||
|
||||
|
||||
\item \textbf{Spectral clustering of real-world graphs [40 points]:}
|
||||
|
||||
\end{enumerate}
|
||||
|
||||
|
||||
\end{document}
|
BIN
mp4/Project_4_Maggioni_Claudio/datasets/Meshes/3elt.mat
Normal file
BIN
mp4/Project_4_Maggioni_Claudio/datasets/Meshes/3elt.mat
Normal file
Binary file not shown.
BIN
mp4/Project_4_Maggioni_Claudio/datasets/Meshes/airfoil1.mat
Normal file
BIN
mp4/Project_4_Maggioni_Claudio/datasets/Meshes/airfoil1.mat
Normal file
Binary file not shown.
BIN
mp4/Project_4_Maggioni_Claudio/datasets/Meshes/barth.mat
Normal file
BIN
mp4/Project_4_Maggioni_Claudio/datasets/Meshes/barth.mat
Normal file
Binary file not shown.
BIN
mp4/Project_4_Maggioni_Claudio/datasets/Meshes/crack_dual.mat
Executable file
BIN
mp4/Project_4_Maggioni_Claudio/datasets/Meshes/crack_dual.mat
Executable file
Binary file not shown.
BIN
mp4/Project_4_Maggioni_Claudio/datasets/Meshes/grid2.mat
Normal file
BIN
mp4/Project_4_Maggioni_Claudio/datasets/Meshes/grid2.mat
Normal file
Binary file not shown.
43
mp4/Project_4_Maggioni_Claudio/datasets/clusterincluster.m
Executable file
43
mp4/Project_4_Maggioni_Claudio/datasets/clusterincluster.m
Executable file
|
@ -0,0 +1,43 @@
|
|||
function data = clusterincluster(N, r1, r2, w1, w2, arms)
|
||||
|
||||
if nargin < 1
|
||||
N = 1000;
|
||||
end
|
||||
if nargin < 2
|
||||
r1 = 1;
|
||||
end
|
||||
if nargin < 3
|
||||
r2 = 5*r1;
|
||||
end
|
||||
if nargin < 4
|
||||
w1 = 0.8;
|
||||
end
|
||||
if nargin < 5
|
||||
w2 = 1/3;
|
||||
end
|
||||
if nargin < 6
|
||||
arms = 64;
|
||||
end
|
||||
|
||||
data = [];
|
||||
|
||||
N1 = floor(N/2);
|
||||
N2 = N-N1;
|
||||
|
||||
phi1 = rand(N1,1) * 2 * pi;
|
||||
% dist1 = r1 + randint(N1,1,3)/3 * r1 * w1;
|
||||
dist1 = r1 + (randi(3,N1,1)-1)/3 * r1 * w1;
|
||||
d1 = [dist1 .* cos(phi1) dist1 .* sin(phi1) zeros(N1,1)];
|
||||
|
||||
perarm = round(N2/arms);
|
||||
N2 = perarm * arms;
|
||||
radperarm = (2*pi)/arms;
|
||||
phi2 = ((1:N2) - mod(1:N2, perarm))/perarm * (radperarm);
|
||||
phi2 = phi2';
|
||||
dist2 = r2 * (1 - w2/2) + r2 * w2 * mod(1:N2, perarm)'/perarm;
|
||||
d2 = [dist2 .* cos(phi2) dist2 .* sin(phi2) ones(N2,1)];
|
||||
|
||||
data = [d1;d2];
|
||||
|
||||
scatter(data(:,1), data(:,2), 20, data(:,3)); axis square;
|
||||
end
|
35
mp4/Project_4_Maggioni_Claudio/datasets/corners.m
Executable file
35
mp4/Project_4_Maggioni_Claudio/datasets/corners.m
Executable file
|
@ -0,0 +1,35 @@
|
|||
function data = corners(N, scale, gapwidth, cornerwidth)
|
||||
|
||||
if nargin < 1
|
||||
N = 1000;
|
||||
end
|
||||
if mod(N,8) ~= 0
|
||||
N = round(N/8) * 8;
|
||||
end
|
||||
|
||||
if nargin < 2
|
||||
scale = 10;
|
||||
end
|
||||
if nargin < 3
|
||||
gapwidth = 2;
|
||||
end
|
||||
if nargin < 4
|
||||
cornerwidth = 2;
|
||||
end
|
||||
|
||||
perCorner = N/4;
|
||||
|
||||
xplusmin = [ones(perCorner,1); -1*ones(perCorner,1); ones(perCorner,1); -1*ones(perCorner,1)];
|
||||
yplusmin = [ones(perCorner,1); -1*ones(2*perCorner,1); ones(perCorner,1)];
|
||||
|
||||
horizontal = [xplusmin(1:2:end) * gapwidth + xplusmin(1:2:end) * scale .* rand(N/2,1), ...
|
||||
yplusmin(1:2:end) * gapwidth + cornerwidth * yplusmin(1:2:end) .* rand(N/2,1), ...
|
||||
floor((0:N/2-1)'/(perCorner*.5))];
|
||||
|
||||
vertical = [xplusmin(2:2:end) * gapwidth + cornerwidth * xplusmin(2:2:end) .* rand(N/2,1), ...
|
||||
yplusmin(2:2:end) * gapwidth + yplusmin(2:2:end) * scale .* rand(N/2,1), ...
|
||||
floor((0:N/2-1)'/(perCorner*.5))];
|
||||
|
||||
data= [horizontal/2; vertical/2];
|
||||
|
||||
end
|
31
mp4/Project_4_Maggioni_Claudio/datasets/crescentfullmoon.m
Executable file
31
mp4/Project_4_Maggioni_Claudio/datasets/crescentfullmoon.m
Executable file
|
@ -0,0 +1,31 @@
|
|||
function data = crescentfullmoon(N, r1, r2, r3)
|
||||
|
||||
if nargin < 1
|
||||
N = 1000;
|
||||
end
|
||||
if mod(N,4) ~= 0
|
||||
N = round(N/4) * 4;
|
||||
end
|
||||
if nargin < 2
|
||||
r1 = 5;
|
||||
end
|
||||
if nargin < 3
|
||||
r2 = 10;
|
||||
end
|
||||
if nargin < 4
|
||||
r3 = 15;
|
||||
end
|
||||
|
||||
N1 = N/4;
|
||||
N2 = N-N1;
|
||||
|
||||
phi1 = rand(N1,1) * 2 * pi;
|
||||
R1 = sqrt(rand(N1, 1));
|
||||
moon = [cos(phi1) .* R1 * r1 sin(phi1) .* R1 * r1 zeros(N1,1)];
|
||||
|
||||
d = r3 - r2;
|
||||
phi2 = pi + rand(N2,1) * pi;
|
||||
R2 = sqrt(rand(N2,1));
|
||||
crescent = [cos(phi2) .* (r2 + R2 * d) sin(phi2) .* (r2 + R2 * d) ones(N2,1)];
|
||||
|
||||
data = [moon/2; crescent/2];
|
30
mp4/Project_4_Maggioni_Claudio/datasets/getGraphs.m
Normal file
30
mp4/Project_4_Maggioni_Claudio/datasets/getGraphs.m
Normal file
|
@ -0,0 +1,30 @@
|
|||
function [Barth,Airfoil,Crack] = getGraphs()
|
||||
% function to get the Adjacency matrix and the coordinate list of various graphs
|
||||
% dimosthenis.pasadakis@usi.ch
|
||||
% ICS, USI.
|
||||
clear all;
|
||||
close all;
|
||||
|
||||
|
||||
addpath Meshes
|
||||
%
|
||||
load('barth.mat');
|
||||
Barth.W = Problem.A;
|
||||
Barth.Pts = Problem.aux.coord;
|
||||
%
|
||||
load('airfoil1.mat');
|
||||
Airfoil.W = Problem.A;
|
||||
Airfoil.Pts = Problem.aux.coord;
|
||||
%
|
||||
load('crack_dual.mat');
|
||||
Crack.W = Problem.A;
|
||||
Crack.Pts = Problem.aux.coord;
|
||||
|
||||
figure;
|
||||
subplot(131)
|
||||
gplotLength(Barth.W,Barth.Pts,2);
|
||||
subplot(132)
|
||||
gplotLength(Airfoil.W,Airfoil.Pts,2);
|
||||
subplot(133)
|
||||
gplotLength(Crack.W,Crack.Pts,2);
|
||||
end
|
63
mp4/Project_4_Maggioni_Claudio/datasets/getPoints.m
Normal file
63
mp4/Project_4_Maggioni_Claudio/datasets/getPoints.m
Normal file
|
@ -0,0 +1,63 @@
|
|||
function [Pts_spirals,Pts_clusterin,Pts_corn,Pts_halfk,Pts_fullmoon,Pts_out] = getPoints()
|
||||
% Function to get the coordinate list of various pointclouds
|
||||
% ----------------------------------------------------------
|
||||
% Copyright (c) 2013, Jeroen Kools
|
||||
%
|
||||
% Modified for academic purposes by D. Pasadakis
|
||||
% dimosthenis.pasadakis@usi.ch
|
||||
% ICS, USI.
|
||||
|
||||
clear all;
|
||||
close all;
|
||||
|
||||
figure;
|
||||
hold on;
|
||||
dotsize = 12;
|
||||
colormap([1 0 .5; % magenta
|
||||
0 0 .8; % blue
|
||||
0 .6 0; % dark green
|
||||
.3 1 0]); % bright green
|
||||
|
||||
subplot(231);
|
||||
Pts_spirals = twospirals();
|
||||
scatter(Pts_spirals(:,1), Pts_spirals(:,2), dotsize,'k'); axis equal;
|
||||
% scatter(Pts_spirals(:,1), Pts_spirals(:,2), dotsize, Pts_spirals(:,3)); axis equal; % visualization
|
||||
% axis off;
|
||||
title('Two spirals');
|
||||
|
||||
subplot(232);
|
||||
Pts_clusterin = clusterincluster();
|
||||
scatter(Pts_clusterin(:,1), Pts_clusterin(:,2), dotsize,'k'); axis equal;
|
||||
% scatter(Pts_clusterin(:,1),Pts_clusterin(:,2), dotsize, Pts_clusterin(:,3)); axis equal; % visualization
|
||||
% axis off;
|
||||
title('Cluster in cluster');
|
||||
|
||||
subplot(233);
|
||||
Pts_corn = corners();
|
||||
scatter(Pts_corn(:,1), Pts_corn(:,2), dotsize,'k'); axis equal;
|
||||
% scatter(Pts_corn(:,1),Pts_corn(:,2), dotsize, Pts_corn(:,3)); axis equal; % visualization
|
||||
% axis off;
|
||||
title('Corners');
|
||||
|
||||
subplot(234);
|
||||
Pts_halfk = halfkernel();
|
||||
scatter(Pts_halfk(:,1), Pts_halfk(:,2), dotsize,'k'); axis equal;
|
||||
% scatter(Pts_halfk(:,1),Pts_halfk(:,2), dotsize, Pts_halfk(:,3)); axis equal; % visualization
|
||||
% axis off;
|
||||
title('Half-kernel');
|
||||
|
||||
subplot(235);
|
||||
Pts_fullmoon = crescentfullmoon();
|
||||
scatter(Pts_fullmoon(:,1), Pts_fullmoon(:,2), dotsize,'k'); axis equal;
|
||||
% scatter(Pts_fullmoon(:,1),Pts_fullmoon(:,2), dotsize,Pts_fullmoon(:,3)); axis equal; % visualization
|
||||
% axis off;
|
||||
title('Crescent & Full Moon');
|
||||
|
||||
subplot(236);
|
||||
Pts_out = outlier();
|
||||
scatter(Pts_out(:,1), Pts_out(:,2), dotsize,'k'); axis equal;
|
||||
% scatter(Pts_out(:,1),Pts_out(:,2),dotsize,Pts_out(:,3)); axis equal; % visualization
|
||||
% axis off;
|
||||
title('Outlier');
|
||||
|
||||
end
|
48
mp4/Project_4_Maggioni_Claudio/datasets/gplotLength.m
Normal file
48
mp4/Project_4_Maggioni_Claudio/datasets/gplotLength.m
Normal file
|
@ -0,0 +1,48 @@
|
|||
function [d] = gplotLength(a, x, linewidth)
|
||||
% function [d] = gplotFancy2(a, x,linewidth)
|
||||
%
|
||||
% plot with colors depending on lengths of
|
||||
% edges in x,
|
||||
% a: Adjacency
|
||||
% x: coords
|
||||
% linewidth: for ploting
|
||||
|
||||
[ai,aj] = find(a);
|
||||
m = length(ai);
|
||||
d = double(a);
|
||||
|
||||
for i = 1:m,
|
||||
d(ai(i),aj(i)) = norm(x(ai(i),:)-x(aj(i),:));
|
||||
end
|
||||
|
||||
[di,dj,dv] = find(d);
|
||||
|
||||
sdv = sort(dv);
|
||||
l = length(sdv);
|
||||
|
||||
ran = [64:-1:0]/64;
|
||||
ran = ran.^2;
|
||||
ran = 1-ran;
|
||||
|
||||
ll = round([1:l/65:l]);
|
||||
ranges = sdv(ll);
|
||||
|
||||
hold on;
|
||||
set(gca,'Color',[0 0 0])
|
||||
|
||||
cm = jet;
|
||||
|
||||
%cm = .3+.7*cm;
|
||||
|
||||
for i = 1:64;
|
||||
ind = (dv <= ranges(i+1))&(dv>ranges(i));
|
||||
|
||||
thisa = sparse(ai(ind),aj(ind),1);
|
||||
[gpx,gpy] = gplot(thisa,x);
|
||||
if (~isempty(gpx)),
|
||||
ph(i) = plot(gpx,gpy,'-','Color',cm(i,:),'LineWidth',linewidth);
|
||||
axis off
|
||||
end
|
||||
|
||||
end
|
||||
|
32
mp4/Project_4_Maggioni_Claudio/datasets/halfkernel.m
Executable file
32
mp4/Project_4_Maggioni_Claudio/datasets/halfkernel.m
Executable file
|
@ -0,0 +1,32 @@
|
|||
function data = halfkernel(N, minx, r1, r2, noise, ratio)
|
||||
|
||||
if nargin < 1
|
||||
N = 1000;
|
||||
end
|
||||
if mod(N,2) ~= 0
|
||||
N = N + 1;
|
||||
end
|
||||
if nargin < 2
|
||||
minx = -20;
|
||||
end
|
||||
if nargin < 3
|
||||
r1 = 20;
|
||||
end
|
||||
if nargin < 4
|
||||
r2 = 35;
|
||||
end
|
||||
if nargin < 5
|
||||
noise = 4;
|
||||
end
|
||||
if nargin < 6
|
||||
ratio = 0.6;
|
||||
end
|
||||
|
||||
phi1 = rand(N/2,1) * pi;
|
||||
inner = [minx + r1 * sin(phi1) - .5 * noise + noise * rand(N/2,1) r1 * ratio * cos(phi1) - .5 * noise + noise * rand(N/2,1) ones(N/2,1)];
|
||||
|
||||
phi2 = rand(N/2,1) * pi;
|
||||
outer = [minx + r2 * sin(phi2) - .5 * noise + noise * rand(N/2,1) r2 * ratio * cos(phi2) - .5 * noise + noise * rand(N/2,1) zeros(N/2,1)];
|
||||
|
||||
data = [inner/4; outer/4];
|
||||
end
|
38
mp4/Project_4_Maggioni_Claudio/datasets/outlier.m
Executable file
38
mp4/Project_4_Maggioni_Claudio/datasets/outlier.m
Executable file
|
@ -0,0 +1,38 @@
|
|||
function data = outlier(N, r, dist, outliers, noise)
|
||||
|
||||
if nargin < 1
|
||||
N = 600;
|
||||
end
|
||||
if nargin < 2
|
||||
r = 20;
|
||||
end
|
||||
if nargin < 3
|
||||
dist = 30;
|
||||
end
|
||||
if nargin < 4
|
||||
outliers = 0.04;
|
||||
end
|
||||
if nargin < 5
|
||||
noise = 5;
|
||||
end
|
||||
|
||||
N1 = round(N * (.5-outliers));
|
||||
N2 = N1;
|
||||
N3 = round(N * outliers);
|
||||
N4 = N-N1-N2-N3;
|
||||
|
||||
phi1 = rand(N1,1) * pi;
|
||||
r1 = sqrt(rand(N1,1))*r;
|
||||
P1 = [-dist + r1.*sin(phi1) r1.*cos(phi1) zeros(N1,1)];
|
||||
|
||||
phi2 = rand(N2,1) * pi;
|
||||
r2 = sqrt(rand(N2,1))*r;
|
||||
P2 = [dist - r2.*sin(phi2) r2.*cos(phi2) 3*ones(N2,1)];
|
||||
|
||||
P3 = [rand(N3,1)*noise dist+rand(N3,1)*noise 2*ones(N3,1)];
|
||||
|
||||
P4 = [rand(N4,1)*noise -dist+rand(N4,1)*noise ones(N4,1)];
|
||||
|
||||
data = [P1/4.5; P2/4.5; P3/4.5; P4/4.5];
|
||||
|
||||
end
|
34
mp4/Project_4_Maggioni_Claudio/datasets/twospirals.m
Executable file
34
mp4/Project_4_Maggioni_Claudio/datasets/twospirals.m
Executable file
|
@ -0,0 +1,34 @@
|
|||
function data = twospirals(N, degrees, start, noise)
|
||||
% Generate "two spirals" dataset with N instances.
|
||||
% degrees controls the length of the spirals
|
||||
% start determines how far from the origin the spirals start, in degrees
|
||||
% noise displaces the instances from the spiral.
|
||||
% 0 is no noise, at 1 the spirals will start overlapping
|
||||
|
||||
if nargin < 1
|
||||
N = 2000;
|
||||
end
|
||||
if nargin < 2
|
||||
degrees = 570;
|
||||
end
|
||||
if nargin < 3
|
||||
start = 90;
|
||||
end
|
||||
if nargin < 5
|
||||
noise = 0.2;
|
||||
end
|
||||
|
||||
deg2rad = (2*pi)/360;
|
||||
start = start * deg2rad;
|
||||
|
||||
N1 = floor(N/2);
|
||||
N2 = N-N1;
|
||||
|
||||
n = start + sqrt(rand(N1,1)) * degrees * deg2rad;
|
||||
d1 = [-cos(n).*n + rand(N1,1)*noise sin(n).*n+rand(N1,1)*noise zeros(N1,1)];
|
||||
|
||||
n = start + sqrt(rand(N1,1)) * degrees * deg2rad;
|
||||
d2 = [cos(n).*n+rand(N2,1)*noise -sin(n).*n+rand(N2,1)*noise ones(N2,1)];
|
||||
|
||||
data = [d1/2;d2/2];
|
||||
end
|
65
mp4/Project_4_Maggioni_Claudio/src/ClusterGraphs.m
Normal file
65
mp4/Project_4_Maggioni_Claudio/src/ClusterGraphs.m
Normal file
|
@ -0,0 +1,65 @@
|
|||
% Cluster 2D real-world graphs with spectral clustering and compare with k-means
|
||||
% USI, ICS, Lugano
|
||||
% Numerical Computing
|
||||
|
||||
clear all;close all;
|
||||
warning OFF;
|
||||
|
||||
addpath ../datasets
|
||||
addpath ../datasets/Meshes
|
||||
|
||||
load airfoil1.mat
|
||||
% load barth.mat
|
||||
% load grid2.mat
|
||||
% load 3elt.mat
|
||||
|
||||
% Specify the number of clusters
|
||||
K = 4;
|
||||
% Read graph
|
||||
W = Problem.A;
|
||||
Pts = Problem.aux.coord;
|
||||
n = size(Pts,1);
|
||||
% dummy var
|
||||
dummy_map = ones(n,1);
|
||||
|
||||
figure;
|
||||
spy(W)
|
||||
title('Adjacency matrix')
|
||||
%% 2a) Create the Laplacian matrix and plot the graph using the 2nd and 3rd eigenvectors
|
||||
% \----------------------------/
|
||||
% Your implementation
|
||||
% \----------------------------/
|
||||
|
||||
% Eigen-decomposition
|
||||
% \----------------------------/
|
||||
% Your implementation
|
||||
% \----------------------------/
|
||||
|
||||
% Plot and compare
|
||||
figure;
|
||||
subplot(1,2,1);
|
||||
gplot(W,Pts)
|
||||
xlabel('Nodal coordinates')
|
||||
subplot(1,2,2);
|
||||
gplot(W,Pts)
|
||||
xlabel('TODO: Plot using Eigenvector coordinates')
|
||||
|
||||
%% 2b) Cluster each graph in K = 4 clusters with the spectral and the
|
||||
% k-means method, and compare yourresults visually for each case.
|
||||
|
||||
% \----------------------------/
|
||||
% Your implementation
|
||||
% \----------------------------/
|
||||
|
||||
|
||||
% Compare and visualize
|
||||
figure;
|
||||
subplot(1,2,1);
|
||||
gplotmap(W,Pts,dummy_map)
|
||||
title('TODO: Plot the spectral clusters')
|
||||
subplot(1,2,2);
|
||||
gplotmap(W,Pts,dummy_map)
|
||||
title('TODO: Plot the K-means clusters')
|
||||
|
||||
%% 2c) Calculate the number of nodes per cluster
|
||||
[Spec_nodes,Kmeans_nodes] = USI_ClusterMetrics(K,dummy_map,dummy_map);
|
13
mp4/Project_4_Maggioni_Claudio/src/ClusterMetrics.m
Normal file
13
mp4/Project_4_Maggioni_Claudio/src/ClusterMetrics.m
Normal file
|
@ -0,0 +1,13 @@
|
|||
function [Spec_nodes,Kmeans_nodes] = ClusterMetrics(K,x_spec,x_kmeans)
|
||||
%% METRICS
|
||||
Spec_nodes = 0;
|
||||
Kmeans_nodes = 0;
|
||||
|
||||
% 2c) Calculate the number of nodes per cluster (for k-means and spectral
|
||||
% clustering) and plot them in a histogram.
|
||||
|
||||
% \----------------------------/
|
||||
% Your implementation
|
||||
% \----------------------------/
|
||||
|
||||
end
|
64
mp4/Project_4_Maggioni_Claudio/src/ClusterPoints.m
Normal file
64
mp4/Project_4_Maggioni_Claudio/src/ClusterPoints.m
Normal file
|
@ -0,0 +1,64 @@
|
|||
% Cluster 2D pointclouds with spectral clustering and compare with k-means
|
||||
% USI, ICS, Lugano
|
||||
% Numerical Computing
|
||||
|
||||
clear variables;
|
||||
close all;
|
||||
warning OFF;
|
||||
|
||||
addpath ../datasets
|
||||
addpath ../datasets/Meshes
|
||||
|
||||
% Specify the number of clusters
|
||||
K = 2;
|
||||
|
||||
%% 1a) Get coordinate list from pointclouds
|
||||
% Coords used in this script
|
||||
Pts = getPoints();
|
||||
figure;
|
||||
scatter(Pts(:,1),Pts(:,2))
|
||||
title('Two Spirals')
|
||||
|
||||
n = size(Pts, 1);
|
||||
|
||||
% Create Gaussian similarity function
|
||||
[S] = similarityfunc(Pts(:,1:2));
|
||||
|
||||
%% 1b) Find the minimal spanning tree of the full graph. Use the information
|
||||
% to determine a valid value for epsilon
|
||||
H = minSpanTree(S);
|
||||
epsilon = max(H(H > 0), [], 'all');
|
||||
|
||||
%% 1c) Create the epsilon similarity graph
|
||||
[G] = epsilonSimGraph(epsilon,Pts, S);
|
||||
|
||||
%% 1d) Create the adjacency matrix for the epsilon case
|
||||
W = S .* G;
|
||||
figure;
|
||||
gplotg(W,Pts(:,1:2))
|
||||
title('Adjacency matrix')
|
||||
%% 1e) Create the Laplacian matrix and implement spectral clustering
|
||||
[L,Diag] = CreateLapl(W);
|
||||
|
||||
% \----------------------------/
|
||||
% Your implementation
|
||||
% \----------------------------/
|
||||
|
||||
% Cluster rows of eigenvector matrix of L corresponding to K smallest
|
||||
% eigennalues. Use kmeans for that.
|
||||
[D_spec,x_spec] = kmeans_mod(Pts,K,n);
|
||||
|
||||
%% 1f) Run K-means on input data
|
||||
% \----------------------------/
|
||||
% Your implementation
|
||||
% \----------------------------/
|
||||
[D_kmeans,x_kmeans] = kmeans_mod(Pts,K,n);
|
||||
|
||||
%% 1g) Visualize spectral and k-means clustering results
|
||||
figure;
|
||||
subplot(1,2,1)
|
||||
gplotmap(W,Pts,dummy_map)
|
||||
title('TODO: Plot the spectral clusters')
|
||||
subplot(1,2,2)
|
||||
gplotmap(W,Pts,dummy_map)
|
||||
title('TODO: Plot the K-means clusters')
|
18
mp4/Project_4_Maggioni_Claudio/src/CreateLapl.m
Normal file
18
mp4/Project_4_Maggioni_Claudio/src/CreateLapl.m
Normal file
|
@ -0,0 +1,18 @@
|
|||
function [L,Diag] = CreateLapl(W)
|
||||
% Create the Laplacian matrix of a graph
|
||||
% Input
|
||||
% W : Adjacency matrix
|
||||
% Output
|
||||
% L : Laplacian
|
||||
|
||||
|
||||
% Degree matrix
|
||||
Diag = zeros(size(W,1));
|
||||
for i = 1:size(W,1)
|
||||
Diag(i,i) = sum(W(:,i));
|
||||
end
|
||||
|
||||
% Construct the Laplacian
|
||||
L = Diag - W;
|
||||
|
||||
end
|
19
mp4/Project_4_Maggioni_Claudio/src/epsilonSimGraph.m
Normal file
19
mp4/Project_4_Maggioni_Claudio/src/epsilonSimGraph.m
Normal file
|
@ -0,0 +1,19 @@
|
|||
function [G] = epsilonSimGraph(epsilon, Pts, S)
|
||||
% Construct an epsilon similarity graph
|
||||
% Input
|
||||
% epsilon: size of neighborhood (calculate from Prim's Algorithm)
|
||||
% Pts : coordinate list of the sample
|
||||
%
|
||||
% Output
|
||||
% A : the epsilon similarity matrix
|
||||
%
|
||||
% USI, ICS, Lugano
|
||||
% Numerical Computing
|
||||
|
||||
fprintf('----------------------------\n');
|
||||
fprintf('epsilon similarity graph\n');
|
||||
fprintf('----------------------------\n');
|
||||
|
||||
G = S <= epsilon;
|
||||
|
||||
end
|
48
mp4/Project_4_Maggioni_Claudio/src/gplotLength.m
Normal file
48
mp4/Project_4_Maggioni_Claudio/src/gplotLength.m
Normal file
|
@ -0,0 +1,48 @@
|
|||
function [d] = gplotLength(a, x, linewidth)
|
||||
% function [d] = gplotLength(a, x,linewidth)
|
||||
%
|
||||
% plot with colors depending on lengths of
|
||||
% edges in x,
|
||||
% a: Adjacency
|
||||
% x: coords
|
||||
% linewidth: for ploting
|
||||
|
||||
[ai,aj] = find(a);
|
||||
m = length(ai);
|
||||
d = double(a);
|
||||
|
||||
for i = 1:m,
|
||||
d(ai(i),aj(i)) = norm(x(ai(i),:)-x(aj(i),:));
|
||||
end
|
||||
|
||||
[di,dj,dv] = find(d);
|
||||
|
||||
sdv = sort(dv);
|
||||
l = length(sdv);
|
||||
|
||||
ran = [64:-1:0]/64;
|
||||
ran = ran.^2;
|
||||
ran = 1-ran;
|
||||
|
||||
ll = round([1:l/65:l]);
|
||||
ranges = sdv(ll);
|
||||
|
||||
clf; hold on;
|
||||
set(gca,'Color',[0 0 0])
|
||||
|
||||
cm = jet;
|
||||
|
||||
%cm = .3+.7*cm;
|
||||
|
||||
for i = 1:64;
|
||||
ind = (dv <= ranges(i+1))&(dv>ranges(i));
|
||||
|
||||
thisa = sparse(ai(ind),aj(ind),1);
|
||||
[gpx,gpy] = gplot(thisa,x);
|
||||
if (~isempty(gpx)),
|
||||
ph(i) = plot(gpx,gpy,'-','Color',cm(i,:),'LineWidth',linewidth);
|
||||
axis off
|
||||
end
|
||||
|
||||
end
|
||||
|
61
mp4/Project_4_Maggioni_Claudio/src/gplotg.m
Normal file
61
mp4/Project_4_Maggioni_Claudio/src/gplotg.m
Normal file
|
@ -0,0 +1,61 @@
|
|||
function handle = gplotg(A,xy,lc)
|
||||
% GPLOTG : Plot a "graph theoretic" graph.
|
||||
%
|
||||
% handle = gplotg(A,xy) plots the graph specified by A and xy.
|
||||
% A graph, G, is a set of nodes numbered from 1 to n,
|
||||
% and a set of connections, or edges, between them.
|
||||
% In order to plot G, two matrices are needed.
|
||||
% The adjacency matrix, A, has a(i,j) nonzero if and
|
||||
% only if node i is connected to node j. The coordinates
|
||||
% array, xy, is an n-by-2 or n-by-3 matrix with the position
|
||||
% for node i in the i-th row, xy(i,:) = [x(i) y(i)],
|
||||
% or xy(i,:) = [x(i) y(i) z(i)].
|
||||
%
|
||||
% gplotg(A,xy,lc) uses line type and color instead of the
|
||||
% default, 'r-'. For example, lc = 'g:'. See PLOT.
|
||||
%
|
||||
% Unlike gplot, gplotg sets 'erasemode' to 'none'
|
||||
% so a graph won't redraw if something is drawn over it.
|
||||
% Also, gplotg returns the handle to the plot.
|
||||
% Also, gplotg can handle graphs with 3D coordinates.
|
||||
%
|
||||
% See also: SPY, TPLOT, SUBMESH, UNMESH.
|
||||
%
|
||||
% John Gilbert, 1991.
|
||||
% Modified 1-21-91, LS; 2-28-92, CBM; 6-14-01, JRG;
|
||||
% Copyright (c) 1991-92 by the MathWorks, Inc.
|
||||
% John Gilbert and Shanghua Teng, 1992-1993.
|
||||
% Copyright (c) 1990-1996 by Xerox Corporation. All rights reserved.
|
||||
% HELP COPYRIGHT for complete copyright and licensing notice.
|
||||
|
||||
if nargin < 3,
|
||||
lc = 'r-';
|
||||
end;
|
||||
|
||||
[i,j] = find(A);
|
||||
[ignore, p] = sort(max(i,j));
|
||||
i = i(p);
|
||||
j = j(p);
|
||||
|
||||
% Create a long, NaN-seperated list of line segments,
|
||||
% rather than individual segments.
|
||||
|
||||
X = [ xy(i,1) xy(j,1) NaN*ones(size(i))]';
|
||||
Y = [ xy(i,2) xy(j,2) NaN*ones(size(i))]';
|
||||
X = X(:);
|
||||
Y = Y(:);
|
||||
|
||||
if size(xy,2) == 2
|
||||
h = plot (X, Y, lc, 'erasemode', 'none');
|
||||
else
|
||||
set(gca,'drawmode','fast');
|
||||
Z = [ xy(i,3) xy(j,3) NaN*ones(size(i))]';
|
||||
Z = Z(:);
|
||||
h = plot3 (X, Y, Z, lc, 'erasemode', 'none');
|
||||
end;
|
||||
|
||||
axis equal;
|
||||
axis off;
|
||||
if nargout >= 1
|
||||
handle = h;
|
||||
end;
|
86
mp4/Project_4_Maggioni_Claudio/src/gplotmap.m
Normal file
86
mp4/Project_4_Maggioni_Claudio/src/gplotmap.m
Normal file
|
@ -0,0 +1,86 @@
|
|||
function handle = gplotmap(A,xy,map,pcolor,ecolor)
|
||||
% GPLOTMAP : Plot a partitioned graph in 2 or 3 dimensions.
|
||||
%
|
||||
% gplotmap(A,xy,map) plots the n-vertex graph specified
|
||||
% by the n by n adjacency (or Laplacian) matrix A
|
||||
% and the n by 2 or 3 matrix of coordinates xy.
|
||||
% Argument map is an n-vector of part numbers, which
|
||||
% assigns each vertex to a part.
|
||||
%
|
||||
% By default, edges that join different parts are omitted, and
|
||||
% the picture shows each part in a different color. The call
|
||||
%
|
||||
% gplotmap(A,xy,map,pcolor,ecolor)
|
||||
%
|
||||
% uses color "pcolor" for the parts and "ecolor" for the
|
||||
% edges between the parts. If "pcolor" has multiple rows,
|
||||
% each part gets the color of one row (in cyclic order).
|
||||
%
|
||||
% See also GPLOTPART.
|
||||
%
|
||||
% John Gilbert 2 August 1994
|
||||
% Copyright (c) 1990-1996 by Xerox Corporation. All rights reserved.
|
||||
% HELP COPYRIGHT for complete copyright and licensing notice.
|
||||
|
||||
[n,n] = size(A);
|
||||
if nargin < 3,
|
||||
map = zeros(1,n);
|
||||
end;
|
||||
if nargin < 4
|
||||
pcolor = [];
|
||||
end;
|
||||
if nargin < 5,
|
||||
ecolor = [];
|
||||
end;
|
||||
|
||||
parts = setfilter(map);
|
||||
nparts = length(parts);
|
||||
if length(pcolor) == 0,
|
||||
pcolor = hsv(nparts);
|
||||
pcolor = pcolor(randperm(nparts),:);
|
||||
end;
|
||||
|
||||
% clf reset
|
||||
% colordef(gcf,'black')
|
||||
if size(xy,2) == 2
|
||||
axis([min(xy(:,1)) max(xy(:,1)) min(xy(:,2)) max(xy(:,2))]);
|
||||
else
|
||||
axis([min(xy(:,1)) max(xy(:,1)) min(xy(:,2)) max(xy(:,2)) ...
|
||||
min(xy(:,3)) max(xy(:,3))]);
|
||||
end;
|
||||
|
||||
axis equal;
|
||||
axis off;
|
||||
lighting gouraud;
|
||||
hold on
|
||||
|
||||
% Count and plot the separating edges.
|
||||
[i,j] = find(A);
|
||||
f = find(map(i) > map(j));
|
||||
if length(f)
|
||||
% xlabel( [int2str(length(f)) ' cut edges on ' int2str(nparts) ' partitions'],'visible','on');
|
||||
if length(ecolor)
|
||||
cut = sparse(i(f),j(f),1,n,n);
|
||||
set(gplotg(cut,xy,'-'),'color',ecolor);
|
||||
end;
|
||||
else
|
||||
% xlabel('0 cut edges','visible','on');
|
||||
end;
|
||||
|
||||
% Plot each piece.
|
||||
ncolor = 1;
|
||||
for partnumber = parts;
|
||||
c = pcolor(ncolor,:);
|
||||
ncolor = rem(ncolor, size(pcolor,1)) + 1;
|
||||
part = find(map == partnumber);
|
||||
set(gplotg(A(part,part),xy(part,:),'-'),'color',c);
|
||||
if n < 500,
|
||||
if size(xy,2) == 2
|
||||
set(plot(xy(part,1),xy(part,2),'o'),'color',c);
|
||||
else
|
||||
set(plot3(xy(part,1),xy(part,2),xy(part,3),'o'),'color',c);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
hold off
|
70
mp4/Project_4_Maggioni_Claudio/src/isConnected.m
Normal file
70
mp4/Project_4_Maggioni_Claudio/src/isConnected.m
Normal file
|
@ -0,0 +1,70 @@
|
|||
%##################################################################
|
||||
% Determine if a graph is connected
|
||||
% Idea by Ed Scheinerman, circa 2006, source: http://www.ams.jhu.edu/~ers/matgraph/
|
||||
% routine: matgraph/@graph/isconnected.m
|
||||
%
|
||||
% INPUTS: adjacency matrix, nxn
|
||||
% OUTPUTS: Boolean variable, 0 or 1
|
||||
%
|
||||
% Note: This function works only for undirected graphs.
|
||||
% GB: last updated, Sep 23 2012
|
||||
%##################################################################
|
||||
|
||||
function S = isConnected(adj)
|
||||
|
||||
if not(isempty(find(sum(adj)==0))); S = false; return; end
|
||||
|
||||
n = length(adj);
|
||||
x = [1; zeros(n-1,1)]; % [1,0,...0] nx1 vector
|
||||
|
||||
while 1
|
||||
y = x;
|
||||
x = adj*x + x;
|
||||
x = x>0;
|
||||
|
||||
if x==y; break; end
|
||||
|
||||
end
|
||||
|
||||
S = true;
|
||||
if sum(x)<n; S = false;
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
% Alternative 1 ==========================================================
|
||||
% If the algebraic connectivity is > 0 then the graph is connected
|
||||
% a=algebraic_connectivity(adj);
|
||||
% S = false; if a>0; S = true; end
|
||||
|
||||
% Alternative 2 ==========================================================
|
||||
% Uses the fact that multiplying the adj matrix to itself k times give the
|
||||
% number of ways to get from i to j in k steps. If the end of the
|
||||
% multiplication in the sum of all matrices there are 0 entries then the
|
||||
% graph is disconnected. Computationally intensive, but can be sped up by
|
||||
% the fact that in practice the diameter is very short compared to n, so it
|
||||
% will terminate in order of log(n)? steps.
|
||||
% function S=isconnected(el):
|
||||
%
|
||||
% S=false;
|
||||
%
|
||||
% adj=edgeL2adj(el);
|
||||
% n=numnodes(adj); % number of nodes
|
||||
% adjn=zeros(n);
|
||||
%
|
||||
% adji=adj;
|
||||
% for i=1:n
|
||||
% adjn=adjn+adji;
|
||||
% adji=adji*adj;
|
||||
%
|
||||
% if length(find(adjn==0))==0
|
||||
% S=true;
|
||||
% return
|
||||
% end
|
||||
% end
|
||||
|
||||
% Alternative 3 ==========================================================
|
||||
% Find all connected components, if their number is 1, the graph is
|
||||
% connected. Use find_conn_comp(adj).
|
28
mp4/Project_4_Maggioni_Claudio/src/kNNSimGraph.m
Normal file
28
mp4/Project_4_Maggioni_Claudio/src/kNNSimGraph.m
Normal file
|
@ -0,0 +1,28 @@
|
|||
function [G] = kNNSimGraph(Pts)
|
||||
% Construct a k-nearest neighbors similarity graph
|
||||
% Input
|
||||
% k : # of neighbors
|
||||
% Pts : coordinate list of the sample
|
||||
%
|
||||
% Output
|
||||
% G : the kNN similarity matrix
|
||||
|
||||
|
||||
n = length(Pts(:,1));
|
||||
kn = ceil(2*log(n));
|
||||
|
||||
|
||||
fprintf('kNN similarity graph\n');
|
||||
for i = 1:n
|
||||
s = repmat(Pts(i,:),n,1);
|
||||
d = Pts - s;
|
||||
% e = diag(d*d');
|
||||
e = sum(d.^2,2);
|
||||
[val,ind] = sort(e);
|
||||
ind(1) = [];
|
||||
nbrs = ind(1:kn);
|
||||
G(i,nbrs) = 1;
|
||||
G(nbrs,i) = 1;
|
||||
end
|
||||
|
||||
end
|
57
mp4/Project_4_Maggioni_Claudio/src/kmeans_mod.m
Normal file
57
mp4/Project_4_Maggioni_Claudio/src/kmeans_mod.m
Normal file
|
@ -0,0 +1,57 @@
|
|||
function [D,x] = kmeans_mod(Y,K,n)
|
||||
% Function to perform k-means clustering
|
||||
% --------------------------------------
|
||||
% Input
|
||||
% Y: data matrix
|
||||
% K: # of clusters
|
||||
% n: number of points
|
||||
% Output
|
||||
% D: centroids
|
||||
% x: assignment(indicator) vector
|
||||
|
||||
|
||||
cand = unique(round(10000*Y)/10000,'rows');
|
||||
c = datasample(cand,K,'Replace',false); % pick K random input pts as initial centroids
|
||||
D = c;
|
||||
x = zeros(size(Y,1),1);
|
||||
D_old = inf*ones(size(D));
|
||||
count = 1;
|
||||
while norm(D - D_old) > 0.00001 & count < 500
|
||||
D_old = D;
|
||||
% Assign points to clusters
|
||||
for i = 1:n
|
||||
min = inf;
|
||||
for k = 1:K
|
||||
dist = norm(Y(i,:) - D(k,:));
|
||||
if dist < min
|
||||
min = dist;
|
||||
x(i) = k;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
% Update centroid locations
|
||||
for k = 1:K
|
||||
ind = find(x == k);
|
||||
if length(ind) == 1
|
||||
D(k,:) = Y(ind,:);
|
||||
else
|
||||
D(k,:) = mean(Y(ind,:));
|
||||
end
|
||||
end
|
||||
|
||||
count = count + 1;
|
||||
end
|
||||
|
||||
for i = 1:n
|
||||
min = inf;
|
||||
for k = 1:K
|
||||
dist = norm(Y(i,:) - D(k,:));
|
||||
if dist < min
|
||||
min = dist;
|
||||
x(i) = k;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
51
mp4/Project_4_Maggioni_Claudio/src/minSpanTree.m
Normal file
51
mp4/Project_4_Maggioni_Claudio/src/minSpanTree.m
Normal file
|
@ -0,0 +1,51 @@
|
|||
function A_sp = minSpanTree(A)
|
||||
%MINSPANTREE Prim's minimal spanning tree algorithm
|
||||
|
||||
% @input A, NxN adjacency matrix
|
||||
% @output A_sp, NxN adjacency matrix of minimum spanning tree
|
||||
|
||||
% Prim's alg idea:
|
||||
% start at any node, find closest neighbor and mark edges
|
||||
% for all remaining nodes, find closest to previous cluster, mark edge
|
||||
% continue until no nodes remain
|
||||
%
|
||||
% INPUTS: graph defined by adjacency matrix, nxn
|
||||
% OUTPUTS: matrix specifying minimum spanning tree (subgraph), nxn
|
||||
%
|
||||
% Other routines used: isConnected.m
|
||||
% Updated: cleaned fprintf
|
||||
|
||||
% IB Last updated: 3/24/14
|
||||
|
||||
|
||||
A_sp = [];
|
||||
|
||||
% check if graph is connected:
|
||||
if not(isConnected(A)); fprintf('This graph is not connected. No spanning tree exists.\n'); return; end
|
||||
|
||||
n = length(A); % number of nodes
|
||||
A_sp = sparse(n,n); % initialize tree
|
||||
|
||||
A(A==0)=inf; % set all zeros in the matrix to inf
|
||||
|
||||
conn_nodes = 1; % nodes part of the min-span-tree
|
||||
rem_nodes = [2:n]; % remaining nodes
|
||||
|
||||
while ~isempty(rem_nodes)
|
||||
|
||||
[minlink]=min(min(A(conn_nodes,rem_nodes)));
|
||||
ind=find(A(conn_nodes,rem_nodes)==minlink);
|
||||
|
||||
[ind_i,ind_j] = ind2sub([length(conn_nodes),length(rem_nodes)],ind(1));
|
||||
|
||||
i=conn_nodes(ind_i); j=rem_nodes(ind_j); % gets back to adj indices
|
||||
A_sp(i,j)=A(i,j); A_sp(j,i)=A(j,i);
|
||||
conn_nodes = [conn_nodes j]; %#ok<AGROW>
|
||||
rem_nodes = setdiff(rem_nodes,j);
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
end
|
20
mp4/Project_4_Maggioni_Claudio/src/setfilter.m
Normal file
20
mp4/Project_4_Maggioni_Claudio/src/setfilter.m
Normal file
|
@ -0,0 +1,20 @@
|
|||
function B = setfilter(A)
|
||||
% SETFILTER : Sort and remove duplicates.
|
||||
%
|
||||
% B = setfilter(A) returns a row vector with one occurrence
|
||||
% of each different element of A, in sorted order.
|
||||
%
|
||||
% Based on code by Asko Huuskonen, Finnish Meteorological Institute,
|
||||
% Asko.Huuskonen@fmi.fi, posted to comp.soft-sys.matlab.
|
||||
% This version by John Gilbert, Xerox PARC, 27 Sep 1993
|
||||
% Copyright (c) 1990-1996 by Xerox Corporation. All rights reserved.
|
||||
% HELP COPYRIGHT for complete copyright and licensing notice.
|
||||
|
||||
if length(A) == 0
|
||||
B = [];
|
||||
return;
|
||||
end;
|
||||
|
||||
B = sort(A(:));
|
||||
B(find(diff(B)==0)) = [];
|
||||
B = B.';
|
19
mp4/Project_4_Maggioni_Claudio/src/similarityfunc.m
Normal file
19
mp4/Project_4_Maggioni_Claudio/src/similarityfunc.m
Normal file
|
@ -0,0 +1,19 @@
|
|||
function [S] = similarityfunc(Pts, sigma)
|
||||
% Create the similarity matrix S from the coordinate list of the input
|
||||
% points
|
||||
% dimosthenis.pasadakis@usi.ch
|
||||
% ICS, USI.
|
||||
|
||||
if nargin < 2
|
||||
% Choose \sigma ~ 2*log(n)
|
||||
n = length(Pts(:,1));
|
||||
sigma = log(n);
|
||||
end
|
||||
|
||||
fprintf('----------------------------\n');
|
||||
fprintf('Gaussian similarity function\n');
|
||||
fprintf('----------------------------\n');
|
||||
S = squareform(pdist(Pts));
|
||||
S = exp(-S.^2 ./ (2*sigma^2));
|
||||
|
||||
end
|
95
mp4/assignment.sty
Normal file
95
mp4/assignment.sty
Normal file
|
@ -0,0 +1,95 @@
|
|||
\usepackage{ifthen}
|
||||
\usepackage[utf8]{inputenc}
|
||||
\usepackage{graphics}
|
||||
\usepackage{graphicx}
|
||||
\usepackage{hyperref}
|
||||
|
||||
\pagestyle{plain}
|
||||
\voffset -5mm
|
||||
\oddsidemargin 0mm
|
||||
\evensidemargin -11mm
|
||||
\marginparwidth 2cm
|
||||
\marginparsep 0pt
|
||||
\topmargin 0mm
|
||||
\headheight 0pt
|
||||
\headsep 0pt
|
||||
\topskip 0pt
|
||||
\textheight 255mm
|
||||
\textwidth 165mm
|
||||
|
||||
\newcommand{\duedate} {}
|
||||
\newcommand{\setduedate}[1]{%
|
||||
\renewcommand\duedate {Due date:~ #1}}
|
||||
\newcommand\isassignment {false}
|
||||
\newcommand{\setassignment}{\renewcommand\isassignment {true}}
|
||||
\newcommand{\ifassignment}[1]{\ifthenelse{\boolean{\isassignment}}{#1}{}}
|
||||
\newcommand{\ifnotassignment}[1]{\ifthenelse{\boolean{\isassignment}}{}{#1}}
|
||||
|
||||
\newcommand{\assignmentpolicy}{
|
||||
\begin{table}[h]
|
||||
\begin{center}
|
||||
\scalebox{0.8} {%
|
||||
\begin{tabular}{|p{0.02cm}p{16cm}|}
|
||||
\hline
|
||||
&\\
|
||||
\multicolumn{2}{|c|}{\Large\textbf{Numerical Computing 2020 --- Submission Instructions}}\\
|
||||
\multicolumn{2}{|c|}{\large\textbf{(Please, notice that following instructions are mandatory: }}\\
|
||||
\multicolumn{2}{|c|}{\large\textbf{submissions that don't comply with, won't be considered)}}\\
|
||||
&\\
|
||||
\textbullet & Assignments must be submitted to \href{https://www.icorsi.ch/course/view.php?id=10018}{iCorsi} (i.e. in electronic format).\\
|
||||
\textbullet & Provide both executable package and sources (e.g. C/C++ files, Matlab).
|
||||
If you are using libraries, please add them in the file. Sources must be organized in directories called:\\
|
||||
\multicolumn{2}{|c|}{\textit{Project\_number\_lastname\_firstname}}\\
|
||||
& and the file must be called:\\
|
||||
\multicolumn{2}{|c|}{\textit{project\_number\_lastname\_firstname.zip}}\\
|
||||
\multicolumn{2}{|c|}{\textit{project\_number\_lastname\_firstname.pdf}}\\
|
||||
\textbullet & The TAs will grade your project by reviewing your project write-up, and looking at the implementation
|
||||
you attempted, and benchmarking your code's performance.\\
|
||||
|
||||
\textbullet & You are allowed to discuss all questions with anyone you like; however: (i) your submission must list anyone you discussed problems with and (ii) you must write up your submission independently.\\
|
||||
\hline
|
||||
\end{tabular}
|
||||
}
|
||||
\end{center}
|
||||
\end{table}
|
||||
}
|
||||
\newcommand{\punkte}[1]{\hspace{1ex}\emph{\mdseries\hfill(#1~\ifcase#1{Points}\or{Points}\else{Points}\fi)}}
|
||||
|
||||
|
||||
\newcommand\serieheader[6]{
|
||||
\thispagestyle{empty}%
|
||||
\begin{flushleft}
|
||||
\includegraphics[width=0.4\textwidth]{usi_inf}
|
||||
\end{flushleft}
|
||||
\noindent%
|
||||
{\large\ignorespaces{\textbf{#1}}\hspace{\fill}\ignorespaces{ \textbf{#2}}}\\ \\%
|
||||
{\large\ignorespaces #3 \hspace{\fill}\ignorespaces #4}\\
|
||||
\noindent%
|
||||
\bigskip
|
||||
\hrule\par\bigskip\noindent%
|
||||
\bigskip {\ignorespaces {\Large{\textbf{#5}}}
|
||||
\hspace{\fill}\ignorespaces \large \ifthenelse{\boolean{\isassignment}}{\duedate}{#6}}
|
||||
\hrule\par\bigskip\noindent% \linebreak
|
||||
}
|
||||
|
||||
\makeatletter
|
||||
\def\enumerateMod{\ifnum \@enumdepth >3 \@toodeep\else
|
||||
\advance\@enumdepth \@ne
|
||||
\edef\@enumctr{enum\romannumeral\the\@enumdepth}\list
|
||||
{\csname label\@enumctr\endcsname}{\usecounter
|
||||
{\@enumctr}%%%? the following differs from "enumerate"
|
||||
\topsep0pt%
|
||||
\partopsep0pt%
|
||||
\itemsep0pt%
|
||||
\def\makelabel##1{\hss\llap{##1}}}\fi}
|
||||
\let\endenumerateMod =\endlist
|
||||
\makeatother
|
||||
|
||||
|
||||
|
||||
|
||||
\usepackage{textcomp}
|
||||
|
||||
|
||||
|
||||
|
BIN
mp4/usi_inf.pdf
Normal file
BIN
mp4/usi_inf.pdf
Normal file
Binary file not shown.
Reference in a new issue