⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ndperm.m

📁 This toolbox contains Matlab code for several graph and mesh partitioning methods, including geometr
💻 M
字号:
function p = ndperm(method,minsep,A,arg2,arg3,arg4)% NDPERM : Nested dissection ordering for a symmetric matrix.%% p = ndperm(method,minsep,A)% returns a nested dissection permutation of symmetric positive definite A,% such that A(p,p) tends to have a sparser Cholesky factor than A.%% Input:%   'method' is the name of the 2-way edge separator function to call.%   minsep   is the size of piece not to partition further.  Default is 8.%   A        is the symmetric matrix.%   arg2, arg3, arg4 are optional additional arguments to the 2-way function.%            arg2 is special : If it has the same number of rows as A,%            then the recursive calls use the appropriate subset of arg2%            as well as of A.  This is useful if the partitioner uses xy coords.%% Output:%     p      is a permutation vector.%% For example,  ndperm('geopart',10,A,xy,0,ntries)%   orders A by geometric nested dissection down to parts of size 10, %   using a call at each stage that looks like geopart(A,xy,0,ntries).%% John Gilbert, 1994.% Copyright (c) 1990-1996 by Xerox Corporation.  All rights reserved.% HELP COPYRIGHT for complete copyright and licensing notice.%% Modified 6 Feb 02 by JRG to use symamd if present on the pieces.if length(minsep) == 0    minsep = 8; end;nargcall = nargin - 2;[mA,nA] = size(A);if mA~=nA, error('argument must be square'); end;if nA == 0, p = []; return; end;p = zeros(1,nA);% Find the connected components of Acomps = components(A);% For each connected component,numbered = 0;for i = min(comps) : max(comps)    comp = find(comps == i);    nS = length(comp);    if nS < minsep        % Bottom of recursion, don't separate further        % (use minimum degree instead)        if exist('symamd')            pS = symamd(A(comp,comp));         else            pS = symmmd(A(comp,comp));        end    else        % Find a separator for the current component.        S = A(comp,comp);        if nargcall >= 2            if size(arg2,1) == nA                Sarg2 = arg2(comp,:);            else                Sarg2 = arg2;            end;        end;        if nargcall == 4            a = feval(method, S, Sarg2, arg3, arg4);        elseif nargcall == 3            a = feval(method, S, Sarg2, arg3);        elseif nargcall == 2            a = feval(method, S, Sarg2);        else            a = feval(method, S);        end;        % Turn the separator into a vertex separator.        sep = vtxsep(S,a);        % Recursive call to number the separated graph.        unsep = other(sep,S);        U = S(unsep,unsep);        if nargcall >= 2            if size(arg2,1) == nA                Uarg2 = Sarg2(unsep,:);            else                Uarg2 = Sarg2;            end;        end;        if nargcall == 4            q = ndperm(method,minsep,U,Uarg2,arg3,arg4);        elseif nargcall == 3            q = ndperm(method,minsep,U,Uarg2,arg3);        elseif nargcall == 2            q = ndperm(method,minsep,U,Uarg2);        else            q = ndperm(method,minsep,U);        end;        if length(unsep)            pS = [unsep(q) sep];        else            pS = sep;        end    end    % Plug the component permutation into the main permutation    p(numbered+1:numbered+nS) = comp(pS);    numbered = numbered + nS;end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -