-
Notifications
You must be signed in to change notification settings - Fork 2
/
eigenDecompositionLBO_Clean.m
104 lines (91 loc) · 3.98 KB
/
eigenDecompositionLBO_Clean.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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
%--------------------------------------------------------------------------
% Function: eigenDecompositionLBO_Clean
% Description: This function compute the eigenvectors and eigenvalues of
% the graph Laplacian. It removes the constant eigenvector and
% returns the number of eigenvector columns specified by the
% user.
%
% [eVec, eVals] = eigenDecompositionLBO_Clean(L,p)
%
% Inputs:
%
% L - Graph Laplacian.
%
% p.NumLBOnumEigVec - Number of eigenvectors to compute, this will include
% the zero eigenvector.
%
% p.CondFac - Condition factor for scaling the Laplacian matrix.
%
% p.EVecToMatch - Eigenvectors to use for finding the correspondence.
% The maximum number of elements in the vector will be
% numEigVec - 1. If the number of elements exceeds
% this then elements will be removed from the vector
% until the maximum number of elements allowed is
% achieved.
% e.g. eigVecsToMatch = [1 2 3];
%
% eigSc - Eigenvalue scaling.
%
% Outputs.
%
% eVecs - Eigenvectors from the Graph Laplacian.
%
% eVals - Eigenvalues from the graph Laplacian.
%
% Usage: Used in the affine invariance framework.
% -------------------------------------------------------------------------
%
% {GrassGraph Algorithm, used to perform affine invariant feature matching.}
% Copyright (C) {2016} {Mark Moyou}
%
% This program is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program. If not, see <http://www.gnu.org/licenses/>.
%
% mmoyou@my.fit.edu
% Information Characterization and Exploitation (ICE) Lab
% ------------------------------------------------------------------------------
function [eVec, eVals] = eigenDecompositionLBO_Clean(L,p)
numPoints = size(L,1);
% Condition matrix for ill-conditioning of Laplacian.
condMat = p.CondFac*eps*speye(numPoints);
% Compute the graph Laplacian on the shapes.
[eVec, eVals] = eigs(L + condMat, p.NumLBOEvec,'SM');
% Eigenvector scaling with the eigenvalues.
if (p.eigSc == 1)
% Scale the eigenvectors by 1/sqrt(eigenvalue)
eVec = eVec*(inv(sqrt(eVals)));
end
% Remove the zeroth eigenvector.
eVec(:,end) = []; % Remove the last column, corresponds to zeroth evec.
% Flip the eigenvector matrices so the eigenvector correponding to the
% smallest eigenvalue is in the first column.
eVec = fliplr(eVec); % Source shape.
% Number of eigenvectors used for the matching.
numEigVecToMatch = numel(p.EvecToMatch);
% Number of eigenvectors remaining after removal of constant eigenvector.
numEigRem = p.NumLBOEvec - 1;
% Remove the extra eigenvectors. If the number number of eigenvectors to
% match is more than the number of eigenvectors generated then the number
% of eigenvectors used to match is reduced by 1.
if (numEigVecToMatch > numEigRem)
% Loop through the number of elements and remove the last element until
% then number of elements is equal to the p.numLBOEvec - 1.
while (numEigVecToMatch > numEigRem)
% Remove the last element of the p.EvecToMatch vector.
p.EvecToMatch(end) = [];
% Number of eigenvectors to use for the matching now.
numEigVecToMatch = numel(p.EvecToMatch);
end
end
% Choose the individual eigenvectors.
eVec = eVec(:, p.EvecToMatch);