-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathcreate_patch_alignment.m
48 lines (44 loc) · 1.5 KB
/
create_patch_alignment.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
function alignment = create_patch_alignment( views, k, t, methods )
%CREATE_PATCH_ALIGNMENT - Creates 3D matrix composed of 2D neighborhood distance matrices.
%
% Syntax: alignment = create_patch_alignment(views,k,methods)
%
% Inputs:
% views - Cell array of feature matrices
% k - Neighborhood size
% t - Kernel parameter
% methods - Method for each view to be used in the distance calculations
%
% Outputs:
% alignment - Patch alignment
%
% Example:
% create_patch_alignment({view1,view2},30,{'euclidean','euclidean']);
%
% Author: Robert Ciszek
% email: [email protected]
% August 2014; Last revision: 21-August-2016
if ~exist('methods', 'var')
methods = repmat({'euclidean'},1,size(views,2));
end
n = size(views{1,1},1);
v = size(views,2);
L = zeros(n,n,v);
W = zeros(n,n,v);
D = zeros(n,n,v);
for v_i=1:v
distances = squareform(pdist(views{1,v_i},char(methods(v_i)))).^2;
distances(isinf(distances)) = 0;
distances(isnan(distances)) = 0;
distances = exp(-distances/t);
[sorted indexes] = sort(distances,2,'descend');
for p=1:n
W(p,indexes(p,2:2+k-1),v_i) = distances(p,indexes(p,2:2+k-1));
W(indexes(p,2:2+k-1),p,v_i) = distances(p,indexes(p,2:2+k-1));
end
W(1+(n^2)*(v_i-1):n+1:v_i*(n^2)) = 0;
D(1+(n^2)*(v_i-1):n+1:v_i*(n^2)) = sum(W(:,:,v_i),2);
L(:,:,v_i) = eye(n) - D(:,:,v_i)^(-1/2)*W(:,:,v_i)*D(:,:,v_i)^(-1/2);
end
alignment = L;
end