- refactored
This commit is contained in:
Executable
+144
@@ -0,0 +1,144 @@
|
||||
% cltest.m
|
||||
% function cltest(dim, numvecperclass, classdist, numClasses, numref, maxIt);
|
||||
% Sample cltest(2, 80, 8, 3, 3, 800)
|
||||
% 17.01.2003, Jens Ahrensfeld
|
||||
% From
|
||||
% "Color Quantization of Images", Orchard, Bouman
|
||||
% IEEE Trans. on Sig. Proc., vol. 39, no. 12, pp. 2677-2690, Dec. 1991.
|
||||
|
||||
function [cb, idx] = clusters_ob(xs,M,tse_max)
|
||||
[nc,len] = size(xs);
|
||||
% Root node
|
||||
tree(1) = node_root(xs, 1:len);
|
||||
|
||||
tse = 0;
|
||||
node = tree(1);
|
||||
end_nodes = 1;
|
||||
num_nodes = 1;
|
||||
lambdas = tree(1).lambda;
|
||||
map = node.q;
|
||||
for m=1:M-1,
|
||||
|
||||
if (num_nodes == 0)
|
||||
break;
|
||||
end;
|
||||
|
||||
[v, i] = max(lambdas);
|
||||
n = end_nodes(i);
|
||||
|
||||
node = tree(n);
|
||||
|
||||
L_n = node.lambda;
|
||||
num_nodes = num_nodes - 1;
|
||||
|
||||
if(node.tse < tse_max)
|
||||
break;
|
||||
end;
|
||||
|
||||
if L_n == 0
|
||||
continue;
|
||||
end;
|
||||
|
||||
lambdas(i) = [];
|
||||
end_nodes(i) = [];
|
||||
|
||||
[node2n, node2n1] = node_split(xs, node);
|
||||
|
||||
if((node2n.N * node2n1.N) == 0)
|
||||
disp('No further split');
|
||||
continue;
|
||||
end;
|
||||
|
||||
tree(2*n) = node2n;
|
||||
tree(2*n+1) = node2n1;
|
||||
|
||||
L2n = tree(2*n).lambda;
|
||||
L2n1 = tree(2*n+1).lambda;
|
||||
|
||||
end_nodes = [end_nodes 2*n 2*n+1];
|
||||
lambdas = [lambdas L2n L2n1];
|
||||
|
||||
num_nodes = num_nodes + 2;
|
||||
|
||||
tse = tse + tree(n).tse;
|
||||
|
||||
|
||||
end;
|
||||
map = [tree(end_nodes).q];
|
||||
lambda = [tree(end_nodes).lambda];
|
||||
len = length(lambda);
|
||||
[v,i] = sort(lambda);
|
||||
s = i(len:-1:1);
|
||||
cnt = 1;
|
||||
for s=s,
|
||||
if (isempty(tree(s).C))
|
||||
break
|
||||
end
|
||||
idx{cnt} = tree(s).C;
|
||||
cb(:,cnt) = map(:,s);
|
||||
cnt = cnt + 1;
|
||||
end;
|
||||
v;
|
||||
|
||||
% ---------------------------------------------------------
|
||||
function [node_2n, node_2n1] = node_split(xs, node)
|
||||
C_n = node.C;
|
||||
e_n = node.e;
|
||||
q_n = node.q;
|
||||
|
||||
i = find(e_n'*xs(:,C_n) <= e_n'*q_n);
|
||||
C_2n = C_n(i);
|
||||
i = find(e_n'*xs(:,C_n) > e_n'*q_n);
|
||||
C_2n1 = C_n(i);
|
||||
|
||||
xs_2n = xs(:,C_2n);
|
||||
xs_2n1 = xs(:,C_2n1);
|
||||
|
||||
R_n = node.R;
|
||||
m_n = node.m;
|
||||
N_n = node.N;
|
||||
|
||||
R_2n = xs_2n*xs_2n';
|
||||
m_2n = sum(xs_2n,2);
|
||||
N_2n = length(C_2n);
|
||||
|
||||
R_2n1 = R_n - R_2n;
|
||||
m_2n1 = m_n - m_2n;
|
||||
N_2n1 = N_n - N_2n;
|
||||
|
||||
node_2n = struct('R',R_2n,'m',m_2n,'N',N_2n,'C',C_2n,'q',0,'e',0,'lambda',0, 'tse', 0);
|
||||
node_2n1 = struct('R',R_2n1,'m',m_2n1,'N',N_2n1,'C',C_2n1,'q',0,'e',0,'lambda',0, 'tse', 0);
|
||||
|
||||
node_2n = node_stat(node_2n, xs);
|
||||
node_2n1 = node_stat(node_2n1, xs);
|
||||
|
||||
% ---------------------------------------------------------
|
||||
function out = node_root(xs, C)
|
||||
xs_n = xs(:,C);
|
||||
R = xs_n*xs_n';
|
||||
m = sum(xs_n,2);
|
||||
N = length(C);
|
||||
|
||||
node = struct('R',R,'m',m,'N',N,'C',C,'q',0,'e',0,'lambda',0, 'tse', 0);
|
||||
|
||||
out = node_stat(node, xs);
|
||||
|
||||
% ---------------------------------------------------------
|
||||
function out = node_stat(in, xs)
|
||||
xs_n = xs(:,in.C);
|
||||
|
||||
Cov_n = in.R - 1/in.N*in.m*in.m';
|
||||
[ev,es] = eig(Cov_n);
|
||||
[max_v,max_i] = max(diag(es));
|
||||
e_n = ev(:,max_i);
|
||||
q_n = in.m/in.N;
|
||||
|
||||
tse_n = norm(xs_n-repmat(q_n,1,in.N))^2;
|
||||
lambda_n = sum(((xs_n - repmat(q_n,1,in.N))'*e_n).^2);
|
||||
in.e = e_n;
|
||||
in.q = q_n;
|
||||
in.tse = tse_n;
|
||||
in.lambda = lambda_n;
|
||||
out = in;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user