-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcalc_eigendecomposition.m
64 lines (51 loc) · 1.85 KB
/
calc_eigendecomposition.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
function coeffs = calc_eigendecomposition(data, eigenvectors, method)
% calc_eigendecomposition.m
%
% Decompose data using eigenvectors and calculate the coefficient of
% contribution of each vector
%
% Inputs: data : data [MxP]
% M = number of points, P = number of independent data
% eigenvectors : eigenvectors [MxN]
% M = number of points, N = number of eigenvectors
% method : type of calculation
% 'matrix', 'matrix_separate', 'regression'
% Output: coeffs : coefficient values [NxP]
%
% Original: James Pang, Monash University, 2022
%%
warning('off')
[M,P] = size(data);
[~,Norig] = size(eigenvectors);
coeffs = zeros(Norig,P);
[~,eigenvectors_unique_ind,~] = unique(eigenvectors', 'stable', 'row');
eigenvectors_unique_ind = eigenvectors_unique_ind';
eigenvectors_nonzero_ind = find(~all(eigenvectors==0,1));
eigenvectors_keep_ind = sort(intersect(eigenvectors_unique_ind, eigenvectors_nonzero_ind));
N = length(eigenvectors_keep_ind);
eigenvectors = eigenvectors(:,eigenvectors_keep_ind);
% eigenvectors_nonzeros = ~all(eigenvectors==0,1);
% N = sum(eigenvectors_nonzeros);
%
% coeffs = zeros(Norig,P);
% eigenvectors = eigenvectors(:,eigenvectors_nonzeros);
if nargin<3
method = 'matrix';
end
switch method
case 'matrix'
coeffs_temp = (eigenvectors.'*eigenvectors)\(eigenvectors.'*data);
case 'matrix_separate'
coeffs_temp = zeros(N,P);
for p = 1:P
coeffs_temp(:,p) = (eigenvectors.'*eigenvectors)\(eigenvectors.'*data(:,p));
end
case 'regression'
coeffs_temp = zeros(N,P);
for p = 1:P
coeffs_temp(:,p) = regress(data(:,p), eigenvectors);
end
end
% coeffs(eigenvectors_nonzeros,:) = coeffs_temp;
coeffs(eigenvectors_keep_ind,:) = coeffs_temp;
end