-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlaplacian_generation.m
79 lines (68 loc) · 2.01 KB
/
laplacian_generation.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
%% Generate Laplican matrix for each view
%% Input
% BseKer -- base kernel
% S -- absent index
% neighbor -- number of neighbors
%% Output
% LM - laplican matrixs
% ALM - average laplican matrix
function highorder_L = laplacian_generation(BseKer)
ker_num = size(BseKer, 3);
smp_num = size(BseKer, 1);
L_record = zeros(smp_num, smp_num, ker_num);
for i = 1 : ker_num
cur_ker = BseKer(:,:,i);
laplacian = LaplicanGeneration(cur_ker);
L_record(:,:,i) = laplacian;
end
highorder_L = cell(1, 2);
highorder_L{1} = L_record;
for i = 1 : ker_num
L_record(:,:,i) = HO_laplacian(L_record(:,:,i));
end
highorder_L{2} = L_record;
% for i = 1 : ker_num
% L_record(:,:,i) = HO_laplacian(L_record(:,:,i));
% end
% highorder_L{3} = L_record;
end
%% Generate Laplican matrix of K according to index matrix A
function [laplacian] = LaplicanGeneration(K)
eye_matrix = 1 - eye(size(K));
K = K .* eye_matrix;
c_diag = sum(K, 2);
c_diag(c_diag == 0) = 1;
c_diag(c_diag < 10^(-10)) = 10^(-10);
c_diag = diag(sqrt(c_diag.^(-1)));
laplacian = eye(size(K)) - c_diag * K * c_diag;
end
%% Generate high-order laplacian
function L_record = HO_laplacian(L_record)
L_record = diag(diag(L_record)) - L_record;
% imagesc(L_record)
L_record = L_record * L_record;
L_record_P = L_record(L_record > 0);
L_record_org = L_record;
mean_value = mean(L_record_P);
std_value = std(L_record_P);
L_record(L_record < mean_value - std_value/2) = 0;
L_record = LaplicanGeneration(L_record);
L_record = kernel_completion(L_record, L_record_org);
% figure()
% imagesc(L_record)
end
function kernel = kernel_completion(kernel, org_kernel)
Avg_index = kernel ~= 0;
Ker_sum = sum(Avg_index, 2);
index = find(Ker_sum == 0);
threshold = mean(kernel(:));
if ~isempty(index)
org_kernel = org_kernel - diag(diag(org_kernel));
Small_samples = org_kernel(index, :);
[~, smp_indexes] = sort(Small_samples,2,'descend');
smp_indexes = smp_indexes(:,1);
for ii = 1 : size(Small_samples, 1)
kernel(index(ii), smp_indexes(ii)) = threshold;
end
end
end