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

📄 colndperm.m

📁 This toolbox contains Matlab code for several graph and mesh partitioning methods, including geometr
💻 M
字号:
function p = colndperm(method,minsep,A,arg2,arg3,arg4)% 0-0 unfinished COLNDPERM : Column nested dissection ordering for a nonsymmetric matrix.%% p = colndperm(method,minsep,A)% returns a nested dissection permutation for the columns of A, such% that A(:,p) tends to have a sparser LU or QR factorization than A.% This is to be used for nonsymmetric matrices.%% 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 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 has cols,%            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),%   where H is the augmented matrix of A.%% John Gilbert, 9 July 2001% Copyright (c) 1990-2001 by Xerox Corporation.  All rights reserved.% HELP COPYRIGHT for complete copyright and licensing notice.%% Modified 6 Feb 02 by JRG to use colamd if present on the pieces.if length(minsep) == 0    minsep = 8; end;nargcall = nargin - 2;[nrA,ncA] = size(A);if ncA == 0, p = []; return; end;p = zeros(1,ncA);% Form the augmented matrix H,% whose graph is the bipartite graph of AH = [speye(nrA,nrA) A ; A' speye(ncA,ncA)];% Find the connected components of Hcomps = components(H);% For each connected component,numbered = 0;for i = min(comps) : max(comps)    rowcomp = find(comps(1:nrA) == i);    colcomp = find(comps(nrA+1 : nrA+ncA) == i);    nS = length(colcomp);    if nS < minsep        % Bottom of recursion, don't separate further        % (use minimum degree instead)        if exist('colamd')            pS = colamd(A(comp,comp));         else            pS = colmmd(A(comp,comp));        end    else        % Find a separator for the current component.        comp = [rowcomp colcomp];        S = H(comp,comp);        if nargcall >= 2            if size(arg2,1) == ncA                Sarg2 = arg2(colcomp,:);            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) 0-0;        % 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 + -