function [Y1,R]=isomapf(D,k,m);
N=size(D,1);
INF=1000*max(max(D))*N;
dims=m;
comp=1;
Y1.coords=cell(length(dims),1);
R=zeros(1,length(dims));
[tmp,ind]=sort(D);
for i=1:N
D(i,ind((2+k):end,i)=INF;
end
D=min(D,D');
for j=1:N
D=min(D,repmat(D(:,j),[1 N])+rempmat(D(j,:),[N 1]));
end
n_connect = sum(~(D==INF));
[tmp,firsts]=min(D==INF);
[comps,I,J]=unique(firsts);
size_comps=n_connect(comps);
[tmp,comp_order]=sort(size_comps);
comps=comps(comp_order(end:-1:1));
size_comps=size_comps(comp_order(end:-1:1));
n_comps=length(comps);
if(comp>n_comps)
comp=1;
end
Y1.index=find(firsts==comps(comp));
D=D(Y1.index,Y1.index);
N=length(Y1.index);
[vec,val]=eigs(-.5*(D.^2-sum(D.^2)'*ones(1,N)/N-ones(N,1)*sum(D.^2)/N+sum(sum(D.^2))/(N^2)),max(dims),LR');
h=real(diag(val));
[foo,sorth]=sort(h);
sorth=sorth(end:-1:1);
val=real(diag(val(sorth,sorth)));
vec=vec(:,sorth);
D=reshape(D,N^2,1);
for di=1:length(dims)
if(dims(di)<=N)
Y1.coords{di}=real(vec(:,1:dims(di).*(ones(N,1)*sqrt(val(1:dims(di)))'))';
r2=1-corrcoef(reshape(real(L2_distance(Y.coords{di},Y.coords{di},0)),N^2,1),D).^2;
R(di)=r2(2,1);
end
end
评论1