0001 function label = kernel4d (G, nseeds)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 fprintf('kernel4d version of 25 oct 2005\n\n');
0021
0022
0023 if isstruct(G)
0024 if isfield(G,'graph')
0025 G = G.graph;
0026 else
0027 G = undirect(G.edgeWeights{1});
0028 end;
0029 end;
0030 if nnz(diag(G)) > 0
0031 G = G - diag(diag(G));
0032 end;
0033 if max(max(G)) > 1 || sum(sum(G)) ~= nnz(G)
0034 G = G~=0;
0035 end;
0036
0037 n = size(G,1);
0038 if nargin < 2
0039 attach = 0;
0040 end;
0041 if nargin < 3
0042 nseeds = ceil(n/50);
0043 end;
0044
0045 label = zeros(1,n);
0046 base = 0;
0047 news = 1;
0048 niters = 0;
0049
0050
0051 while (nnz(label) < n) && (nnz(news) > 0)
0052 niters = niters+1;
0053
0054
0055 f = find(label==0);
0056 nseeds = min(nseeds, length(f));
0057 fprintf('iteration: %d, new seeds: %d, ', niters, double(nseeds));
0058 v = f(1:nseeds);
0059
0060
0061
0062 C = sparse(v, 1:nseeds, 1, n, nseeds);
0063 C = G*C;
0064 C = C + G*C;
0065 C = C > 5;
0066
0067
0068 news = firstinrow(C);
0069
0070
0071 news(label~=0) = 0;
0072
0073
0074 fprintf('new cluster vertices: %d, remaining: %d\n', ...
0075 nnz(news), double(n-nnz(label)-nnz(news)));
0076 label(news~=0) = news(news~=0) + base;
0077 base = base + nseeds;
0078 end;
0079
0080
0081 f = find(label==0);
0082 fprintf('leftover vertices: %d\n',nnz(f));
0083 label(f) = (base+1 : base+length(f));
0084
0085
0086 label = fixuplabels(label);
0087
0088
0089
0090 if 0
0091 csize = full(sparse(label, 1, 1));
0092 fprintf('reattaching %d singleton clusters\n',nnz(csize==1));
0093 mysize = csize(label);
0094 v = find(mysize==1);
0095 [I,J] = find(G(:,v));
0096 S = sparse(label(I),J,1,max(label),length(v));
0097 [ignore,newl] = max (S);
0098 label(v) = newl;
0099 end;
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109