📄 gmcompo.m
字号:
function rlabel = gmcompo(mesh);% gmcompo: find connected components of a mesh% returns an array (zba) holding labels, one label per% node.% use an n*alpha(n) union-find algorithm.gdim = double(mesh{1});di = double(mesh{2});[scrap,numnode] = size(mesh{4});parent = zba((0:(numnode-1))');lsize = zba(ones(numnode,1));tmplist = zeros(numnode,1);[scrap,numelt] = size(mesh{5});for snum = 0 : numelt - 1 for whichnode = 0 : gdim - 1 v = zeros(2,1); v(1) = double(mesh{5}(whichnode + 1, snum)); v(2) = double(mesh{5}(whichnode + 2, snum)); label = zeros(2,1); %% look up labels of v(1) and v(2) %% use path compression. for whichend = 1 : 2 j1 = v(whichend); p = double(parent(j1)); tmplistsize = 1; tmplist(1) = j1; while p ~= j1 tmplistsize = tmplistsize + 1; tmplist(tmplistsize) = p; j1 = p; p = double(parent(p)); end for i = 1 : tmplistsize parent(tmplist(i)) = p; end label(whichend) = double(p); end if label(1) ~= label(2) % merge labels 1 and 2 if lsize(label(1)) >= lsize(label(2)) largerc = label(1); smallerc = label(2); else largerc = label(2); smallerc = label(1); end parent(smallerc) = largerc; lsize(largerc) = lsize(largerc) + lsize(smallerc); lsize(smallerc) = 0; end endend%% Now renumber the active labels.renumlabel = cumsum(lsize > 0) - ones(numnode,1);rlabel = zba(zeros(numnode,1));for vnum = 0 : numnode - 1 % Get the label of node vnum. Apply path compression j1 = vnum; p = double(parent(j1)); tmplistsize = 1; tmplist(1) = j1; while p ~= j1 tmplistsize = tmplistsize + 1; tmplist(tmplistsize) = p; j1 = p; p = double(parent(p)); end for i = 1 : tmplistsize parent(tmplist(i)) = p; end rlabel(vnum) = renumlabel(p);end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -