https://github.com/ruqihuang/AdjointFmaps
Raw File
Tip revision: d41efaa1636fb8cc0da8f09d89f4a1cae0172320 authored by ruqihuang on 24 August 2017, 07:39:27 UTC
Update readme
Tip revision: d41efaa
Joint_shape_analysis_F4.m
clc; clear; close all; 
addpath(genpath('data')); 
addpath(genpath('external')); 
addpath(genpath('utils')); 

S1 = read_off_shape('deform_sph_38.off'); 
S2 = read_off_shape('deform_sph_8.off'); 

kEig = 60; 
L{1} = compute_laplacian_basis(S1, kEig); 
L{2} = compute_laplacian_basis(S2, kEig); 

% compute ground-truth funcitonal maps
C = cell(2);
for i = 1:2
    for j = 1:2
        if i ~= j
            C{i, j} = L{j}.evecs'*L{j}.A*L{i}.evecs; 
        else
            C{i, j} = eye(kEig); 
        end
    end
end

% compute the shape difference operators
[u1, v1] = eig(C{1, 2}'*C{1, 2}); 
[v1, ind] = sort(diag(v1), 'descend'); 
u1 = u1(:, ind); 

[u2, v2] = eig(C{2, 1}'*C{2, 1});
[v2, ind] = sort(diag(v2), 'descend'); 
u2 = u2(:, ind); 

s = max(max(v1), max(v2)); 


U= extract_latent_basis(C); 



% Select the consistent basis
l = 52; 
B = U.evecs(:, 1:l); 

X = cell(size(C)); 
for i = 1:length(C)
    for j = 1:length(C)
        X{i, j} = C{j, i}';
    end
end

W = extract_latent_basis(X); 


E = B'*W.mat*B; 
E = (E+E')/2; 

[u, v] = eig(E); 
[v, idx] = sort(diag(v), 'descend'); 
u = u(:, idx); 


f = u(:, 1); 
f1 = L{1}.evecs*(U.bases{1}(:, 1:l)*f); 
f2 = L{2}.evecs*(U.bases{2}(:, 1:l)*f); 
g = u(:, 4); 
g1 = L{1}.evecs*(U.bases{1}(:, 1:l)*g); 
g2 = L{2}.evecs*(U.bases{2}(:, 1:l)*g); 

figure; 
subplot(3, 4, 1); 
plot(v1, 'LineWidth', 2); 
xlabel('Index', 'FontWeight','bold','FontSize',30);
ylabel('Spectrum of D_{M, N}', 'FontWeight','bold', 'FontSize',30);
ylim([0, s+0.1]); 
xlim([0, 60]); 
set(gca,'fontsize',5)
hold on; 
plot(1,v1(1),'r.', 'MarkerSize',10); 
hold on; 
plot(60, v1(60), 'k.', 'MarkerSize',10); 

subplot(3, 4, 2); 
plot(v2, 'LineWidth', 2); 
xlabel('Index', 'FontWeight','bold','FontSize',30);
ylabel('Spectrum of D_{N, M}', 'FontWeight','bold', 'FontSize',30);
ylim([0, s+0.1]); 
xlim([0, 60]); 
set(gca,'fontsize',5)
hold on; 
plot(1,v2(1),'r.', 'MarkerSize',10); 
hold on; 
plot(60, v2(60), 'k.', 'MarkerSize',10); 

subplot(3, 4, 3); 
plot(v, 'LineWidth', 2); 
xlabel('Index', 'FontWeight','bold','FontSize',30);
ylabel('Spectrum of V^X', 'FontWeight','bold', 'FontSize',30);
xlim([0, 60])
set(gca,'fontsize',5)
hold on; 
plot(1,v(1), 'r.', 'MarkerSize',10); 
hold on; 
plot(4, v(4), 'k.', 'MarkerSize',10); 

subplot(3, 4, 5); 
plotMesh(L{1}, (L{1}.evecs*u1(:, 1)).^2, 180, -60);

subplot(3, 4, 6); 
plotMesh(L{2}, (L{2}.evecs*u2(:, 1)).^2, 180, -60);

subplot(3, 4, 7); 
plotMesh(L{1}, f1.^2, 180, -60); 

subplot(3, 4, 8); 
plotMesh(L{2}, f2.^2, 180, -60); 

subplot(3, 4, 9); 
plotMesh(L{1}, (L{1}.evecs*u1(:, 60)).^2, 180, -60); 

subplot(3, 4, 10); 
plotMesh(L{2}, (L{2}.evecs*u2(:, 60)).^2, 180, -60);

subplot(3, 4, 11); 
plotMesh(L{1}, g1.^2, 180, -60); 

subplot(3, 4, 12); 
plotMesh(L{2}, g2.^2, 180, -60); 
back to top